6 条题解

  • 4
    @ 2024-1-31 19:37:25

    话不多说上代码(AC完别忘点赞)

    #include <bits/stdc++.h>
    #define N 1000005
    using namespace std;
    typedef long long ll;
     
    template <typename T>
    inline void read(T &num) {
    	T x = 0; char ch = getchar();
    	for (; ch > '9' || ch < '0'; ch = getchar());
    	for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0');
    	num = x; 
    }
     
    const ll mod = 998244353;
    int n, m, Q, F[N];
    int head[N], pre[N<<1], to[N<<1], sz, inde[N];
    ll a[N];
     
    inline void addedge(int u, int v) {
    	pre[++sz] = head[u]; head[u] = sz; to[sz] = v; inde[v]++;
    }
     
    struct oper {
    	int tp, p;
    	ll v, mul, sum; 
    } b[N];
     
    queue<int> q;
    int ord[N], bnbn;
    void toposort() { //拓扑排序
    	for (int i = 1; i <= m; i++) if (!inde[i]) q.push(i);
    	while (!q.empty()) {
    		int x = q.front(); q.pop();
    		ord[++bnbn] = x;
    		for (int i = head[x]; i; i = pre[i]) {
    			int y = to[i];
    			inde[y]--;
    			if (!inde[y]) q.push(y);
    		}
    	}
    }
     
    void getmul() { //计算节点的mul
    	for (int i = m; i; i--) {
    		int x = ord[i];
    		for (int j = head[x]; j; j = pre[j]) {
    			int y = to[j];
    			b[x].mul = b[x].mul * b[y].mul % mod;
    		}
    	} 
    }
     
    void getsum() { //下传节点的sum
    	for (int i = 1; i <= m; i++) {
    		int x = ord[i]; ll now = 1;
    		for (int j = head[x]; j; j = pre[j]) {
    			int y = to[j];
    			b[y].sum = (b[y].sum + b[x].sum * now % mod) % mod;
    			now = now * b[y].mul % mod;
    		}
    	}
    }
     
    int main() {
    	read(n); 
    	for (int i = 1; i <= n; i++) read(a[i]); 
    	read(m);
    	for (int i = 1; i <= m; i++) {
    		read(b[i].tp);
    		if (b[i].tp == 1) {
    			read(b[i].p); read(b[i].v);
    			b[i].mul = 1;
    		} else if (b[i].tp == 2) {
    			read(b[i].v); b[i].mul = b[i].v;
    		} else {
    			read(b[i].p); b[i].mul = 1;
    			for (int j = 1, x; j <= b[i].p; j++) {
    				read(x);
    				addedge(i, x);
    			}
    		}
    	}
    	toposort(); 
    	getmul();
    	read(Q); ll now = 1;
    	for (int i = 1; i <= Q; i++) read(F[i]);
    	for (int i = Q; i; i--) {
    		int x = F[i]; b[x].sum = (b[x].sum + now) % mod;
    		now = now * b[x].mul % mod;
    	}
    	getsum();
    	for (int i = 1; i <= n; i++) a[i] = a[i] * now % mod;
    	for (int i = 1; i <= m; i++) {
    		if (b[i].tp == 1) {
    			a[b[i].p] = (a[b[i].p] + b[i].v * b[i].sum % mod) % mod;
    		}
    	}
    	for (int i = 1; i <= n; i++) printf("%lld ", a[i]);
    	return 0; 
    }
    
    • 0
      @ 2023-9-6 18:30:44

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      </span>

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      }
      

      Copy

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 0
        @ 2023-9-6 17:31:38

        为啥没人发题解

      • -1
        @ 2024-3-28 20:39:20

        #include <bits/stdc++.h> #define N 1000005 using namespace std; typedef long long ll;

        template <typename T> inline void read(T &num) { T x = 0; char ch = getchar(); for (; ch > '9' || ch < '0'; ch = getchar()); for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0'); num = x; }

        const ll mod = 998244353; int n, m, Q, F[N]; int head[N], pre[N<<1], to[N<<1], sz, inde[N]; ll a[N];

        inline void addedge(int u, int v) { pre[++sz] = head[u]; head[u] = sz; to[sz] = v; inde[v]++; }

        struct oper { int tp, p; ll v, mul, sum; } b[N];

        queue<int> q; int ord[N], bnbn; void toposort() { //拓扑排序 for (int i = 1; i <= m; i++) if (!inde[i]) q.push(i); while (!q.empty()) { int x = q.front(); q.pop(); ord[++bnbn] = x; for (int i = head[x]; i; i = pre[i]) { int y = to[i]; inde[y]--; if (!inde[y]) q.push(y); } } }

        void getmul() { //计算节点的mul for (int i = m; i; i--) { int x = ord[i]; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[x].mul = b[x].mul * b[y].mul % mod; } } }

        void getsum() { //下传节点的sum for (int i = 1; i <= m; i++) { int x = ord[i]; ll now = 1; for (int j = head[x]; j; j = pre[j]) { int y = to[j]; b[y].sum = (b[y].sum + b[x].sum * now % mod) % mod; now = now * b[y].mul % mod; } } }

        int main() { read(n); for (int i = 1; i <= n; i++) read(a[i]); read(m); for (int i = 1; i <= m; i++) { read(b[i].tp); if (b[i].tp == 1) { read(b[i].p); read(b[i].v); b[i].mul = 1; } else if (b[i].tp == 2) { read(b[i].v); b[i].mul = b[i].v; } else { read(b[i].p); b[i].mul = 1; for (int j = 1, x; j <= b[i].p; j++) { read(x); addedge(i, x); } } } toposort(); getmul(); read(Q); ll now = 1; for (int i = 1; i <= Q; i++) read(F[i]); for (int i = Q; i; i--) { int x = F[i]; b[x].sum = (b[x].sum + now) % mod; now = now * b[x].mul % mod; } getsum(); for (int i = 1; i <= n; i++) a[i] = a[i] * now % mod; for (int i = 1; i <= m; i++) { if (b[i].tp == 1) { a[b[i].p] = (a[b[i].p] + b[i].v * b[i].sum % mod) % mod; } } for (int i = 1; i <= n; i++) printf("%lld ", a[i]); return 0; }

        • -1
          @ 2023-2-25 14:28:38

          写题解请注意

          鼓励大家写题解,但注意题解格式。

          题解一定要有思路解析或代码注释,能否让别人理解你的思路

          也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

          给代码两端加上这个会舒服一些

          ```cpp

          你的代码

          ```

          </span>

          这个点在键盘的左上角tab上面那个键,注意切换输入法

          #include<iostream>
          using namespace std;
          int main()
          {
              int n;
              cin>>n;//这是一个注释
              return 0;
          }
          

          请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

          抄袭题解一经发现直接取消成绩。

          题解被删除的可能

          1. 代码不符合格式规范
          2. 没有思路讲解或者没有注释,
          3. 无意义的题解

          大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

          • -3
            @ 2023-2-6 15:38:54

            写题解请注意

            鼓励大家写题解,但注意题解格式。

            题解一定要有思路解析或代码注释,能否让别人理解你的思路

            也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

            给代码两端加上这个会舒服一些

            ```cpp

            你的代码

            ```

            </span>

            这个点在键盘的左上角tab上面那个键,注意切换输入法

            #include<iostream>
            using namespace std;
            int main()
            {
                int n;
                cin>>n;//这是一个注释
                return 0;
            }
            

            请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

            抄袭题解一经发现直接取消成绩。

            题解被删除的可能

            1. 代码不符合格式规范
            2. 没有思路讲解或者没有注释,
            3. 无意义的题解

            大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

          • 1

          信息

          ID
          1363
          时间
          1000ms
          内存
          256MiB
          难度
          3
          标签
          递交数
          32
          已通过
          20
          上传者