zoukankan      html  css  js  c++  java
  • 10.11解题报告

    考试时间分配:


    (T1) (1h30min)

    (T2) (1h30min)

    (T3) (0min)

    考试分数:


    (T1) (100pts)

    (T2) (96pts)

    (T3) (0pts)

    考试总结:


    输出文件名打错,错误比较严重,就算程序打得再好,文件名错了,照样零分,和没打一个样。感谢老师改了过来。时间分配较为合理,脑子今天比较活,多上厕所或许可以使脑子思路更清晰。
    

    思路:


    T1

    题目名称叫做线段树,但是这个题不一定是用线段树去做。

    如果用线段树去做,每一次操作都是单点的,所以还不如不用。

    看题目提供的操作有两个单点操作,一个区间操作(全部修改),这样的复杂度最坏的情况是O(nq),很不理想。

    我们需要优化,可以优化的有这么几点:
    1.	我们可以维护一个sum值,在改变的时候可以O(1)的输出。
    2.	我们可以设一个变量flag为全局值,就是操作三的要修改为的数。再设一个flag_x为flag是第几次修改,记录下标。Tag数组可以记录第j个数在第几次变成了flag。再在该基础上修改序列值。
    

    经过优化,每一次操作都是O(1)的,所以我们的总复杂度可以降低到O(q)的复杂度,所以是可以过的。

    T2

    最长路,听上去与最短路类似,所以可能会用dij或者SPFA法,一开始我打了一个堆优化dij,但是该复杂度是能拿到40pts,并不太行。

    然后看到保证一定有最长路,那么这又是一个有向图,所以就是有向无环图,DAG。可以使用拓扑排序+dp来求最长路。

    每一次都是用入度为零的点开始推这个点所可以到达的点的最长路。状态转移方程大约是

    dp[v] = max(dp[v], dp[u]+t[i].dis)
    

    u是指该边起点;v是指该边的终点,t[i].dis是指该边的长度.
    然后就在转移中取一个max就做完了。

    代码:

    T1:

    #include <bits/stdc++.h>
    typedef long long ll;
    const int Max = 1e7 + 80;
    const int MAXSIZE = 50000020;
    int bufpos;
    char buf[MAXSIZE];
    int re() {
        int val = 0;
        for(; buf[bufpos] < '0' || buf[bufpos] > '9'; bufpos ++);
        for(; buf[bufpos] >= '0' && buf[bufpos] <= '9'; bufpos ++)
            val = val * 10 + buf[bufpos] - '0';
        return val;
    }
    void write(ll x) {
    	if(x < 0) x = - x, putchar('-');
    	if(x > 9) write(x / 10); putchar(x % 10 ^ 48);
    }
    int n, q, a[Max], flag, tag[Max], flag_x = 0;
    ll sum = 0;
    int main() {
    	freopen("segmenttree.in", "r", stdin); freopen("segmenttree.out", "w", stdout);
    	buf[fread(buf, 1, MAXSIZE, stdin)] = '';
      bufpos = 0;
      n = re(); q = re();
      for(int i = 1; i <= q; i ++) {
       	int opt = re();
        if(opt == 1) {
    			int x = re(), y = re();
    			if(tag[x] == flag_x) sum -= a[x];
    			else {
    				tag[x] = flag_x;
    				sum -= flag;
    			}
    			sum += y;
    			a[x] = y;
    		}
    		else if(opt == 2) {
       		int x = re(), y = re();
    			if(tag[x] == flag_x) {
    				a[x] += y;
    			}
    			else {
    				a[x] = flag + y; tag[x] = flag_x;
    			}
    			sum += y;
    		}
    		else {
       		int y = re();
    			flag = y; flag_x = i;
    			sum = y * n;
    		}
    		write(sum); putchar('
    ');
    	}
    	return 0;
    }
    

    T2:

    #include <cstdio>
    #include <queue>
    #define re register
    typedef long long ll;
    const int Max = 1e6 + 150;
    const ll INF = 0x7ffffff;
    const int MAXSIZE = 50000020;
    int bufpos;
    char buf[MAXSIZE];
    inline ll max(ll a, ll b) { return a > b ? a : b;}
    inline int read() {
        int val = 0;
        for(; buf[bufpos] < '0' || buf[bufpos] > '9'; bufpos ++);
        for(; buf[bufpos] >= '0' && buf[bufpos] <= '9'; bufpos ++)
            val = val * 10 + buf[bufpos] - '0';
        return val;
    }
    struct edge {
    	ll to, net, dis;
    }t[Max];
    int n, m, head[Max], cnt, du[Max];
    ll dp[Max], ans = -INF;
    inline void insert(ll u, ll v, ll w) {
    	t[++cnt].to = v;
    	t[cnt].net = head[u];
    	t[cnt].dis = w;
    	head[u] = cnt;
    }
    std :: queue<int> q;
    int main() {
    	freopen("lpsa.in", "r", stdin); freopen("lpsa.out", "w", stdout);
    	buf[fread(buf, 1, MAXSIZE, stdin)] = '';
      bufpos = 0;
      n = read(); m = read();
      for(int i = 1; i <= m; i ++){
      	int u = read(), v = read(), w = read();
    		insert(u, v, w); du[v] ++;
    	}
    	for(re int i = 1; i <= n; ++ i)
    		if(du[i] == 0) q.push(i);
    	int u, v;
    	while(!q.empty()) {
    		u = q.front(); q.pop();
    		for(re int i = head[u]; i; i = t[i].net) {
    			v = t[i].to;
    			dp[v] = max(dp[v], dp[u] + t[i].dis);
    			ans = max(ans, dp[v]);
    			du[v] --;
    			if(du[v] == 0) q.push(v);
    		}
    	}
    	printf("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/ypay/p/11656833.html
Copyright © 2011-2022 走看看