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;
    }
    
  • 相关阅读:
    php中除法取整的方法(round,ceil,floor)
    ajax 实现修改功能
    ueditor PHP版本使用方法
    $.ajax json 在本地正常 上传服务器不正常
    Web常见几种攻击与预防方式
    PHP使用Session遇到的一个Permission denied Notice解决办法
    VUE引入模块之import xxx from 'xxx' 和 import {xxx} from 'xxx'的区别
    JS事件委托或者事件代理原理以及实现
    JS 一次性事件问题
    原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度
  • 原文地址:https://www.cnblogs.com/ypay/p/11656833.html
Copyright © 2011-2022 走看看