zoukankan      html  css  js  c++  java
  • 联赛模拟测试15

    A.游戏

    (不)排序+乱搞/暴力/二分图/冰茶几(正解) 均可AC
    考场上手动模拟了20以内的数据都hack掉了
    没想到交上过了
    ,,,
    就挺意外的

    B.嘟嘟噜

    搞一搞,对于中间不用取模的地方,不再使用加法,而是直接乘过去,调整下标

    Code
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <cmath>
    using namespace std;
    
    inline int read(){
    	int x = 0, w = 1;
    	char ch = getchar();
    	for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
    	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    	return x * w;
    }
    
    inline void write(register int x){
    	if(x < 0) x = ~x + 1, putchar('-');
    	if(x > 9) write(x / 10);
    	putchar(x % 10 + '0');
    }
    
    signed main(){
        freopen("mayuri.in","r",stdin);
        freopen("mayuri.out","w",stdout);
        register int T = read();
        while(T--){
            int n = read(), m = read(), x = 0, i = m;
            for(register int j = 2; j <= min(n, m); j++)
                x=(x+m)%j;
            if(n <= m) printf("%d
    ", x + 1);
            else{
                x += 1;
                while("GARY CSL"){
                    int nxt = i + (int)ceil(1.0 * (i - x) / (m - 1));
                    if(nxt > n)break;
                    x = (x + (nxt - i) * m);
                    if(x == nxt){
                        if(++nxt > n) break;
                        x = (x + m) % nxt;
                    }else x %= nxt;
                    i = nxt;
                }
                x += (n - i) * m;
                printf("%d
    ", x);
            }
        }
        return 0;
    }
    

    C.天才绅士少女助手克里斯蒂娜

    化简柿子
    线段树维护(x^2,y^2,xy)即可

    Code
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #define ls (u << 1)
    #define rs (ls | 1)
    using namespace std;
    
    inline int read(){
    	int x = 0, w = 1;
    	char ch = getchar();
    	for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
    	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    	return x * w;
    }
    
    inline void write(register int x){
    	if(x < 0) x = ~x + 1, putchar('-');
    	if(x > 9) write(x / 10);
    	putchar(x % 10 + '0');
    }
    
    const int ss = 1000010;
    const int mod = 20170927;
    
    struct node{
    	long long xx, yy, xy;
    }tr[ss << 2];
    
    struct ANS{
    	long long a, b, c;
    	inline void init(){a = 0, b = 0, c = 0;}
    	inline ANS operator + (const ANS &A) const {
    		ANS B;
    		B.a = (long long)(A.a + a) % mod;
    		B.b = (long long)(A.b + b) % mod;
    		B.c = (long long)(A.c + c) % mod;
    		return B;
    	}
    	inline void print(){
    		write((a * b % mod -  c * c % mod + mod) % mod);
    		puts("");
    	}
    };
    
    int a[ss], b[ss];
    inline void push_up(register int u){
    	tr[u].xx = (tr[ls].xx + tr[rs].xx) % mod;
    	tr[u].yy = (tr[ls].yy + tr[rs].yy) % mod;
    	tr[u].xy = (tr[ls].xy + tr[rs].xy) % mod;
    }
    
    inline void build(register int u, register int l, register int r){
    	if(l == r){
    		tr[u].xx = a[l] * a[l];
    		tr[u].yy = b[l] * b[l];
    		tr[u].xy = a[l] * b[l];
    		return;
    	}
    	register int mid = l + r >> 1;
    	build(ls, l, mid);
    	build(rs, mid + 1, r);
    	push_up(u);
    }
    
    inline void change(register int u, register int l, register int r, register int pos, register int modify_x, register int modify_y){
    	if(l == r){
    		tr[u].xx = 1ll * modify_x * modify_x % mod;
    		tr[u].yy = 1ll * modify_y * modify_y % mod;
    		tr[u].xy = 1ll * modify_x * modify_y % mod;
    		return;
    	}
    	register int mid = l + r >> 1;
    	if(pos <= mid) change(ls, l, mid, pos, modify_x, modify_y);
    	else change(rs, mid + 1, r, pos, modify_x, modify_y);
    	push_up(u);
    }
    
    inline ANS query(register int u, register int l, register int r, register int s, register int t){
    	if(s <= l && t >= r){
    		register ANS ans;
    		ans.a = tr[u].xx;
    		ans.b = tr[u].yy;
    		ans.c = tr[u].xy;
    		return ans;
    	}
    	register ANS ans;
    	ans.init();
    	register int mid = l + r >> 1;
    	if(s <= mid) ans = ans + query(ls, l, mid, s, t);
    	if(t > mid) ans = ans + query(rs, mid + 1, r, s, t);
    	return ans;
    }
    
    signed main(){
    	freopen("kurisu.in", "r", stdin);
    	freopen("kurisu.out", "w", stdout);
    	register int n = read(), m = read();
    	for(register int i = 1; i <= n; i++) a[i] = read(), b[i] = read();
    	build(1, 1, n);
    	while(m--){
    		register int op = read();
    		if(op == 1){
    			register int k = read(), x = read(), y = read();
    			change(1, 1, n, k, x, y);
    		}
    		else{
    			register int l = read(), r = read();
    			register ANS ans = query(1, 1, n, l, r);
    			ans.print();
    		}
    	}
    	return 0;
    }
    

    D.凤凰院凶真

    维护最长公共上升子序列
    学习老姚课件

    Code
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #define ls (u << 1)
    #define rs (ls | 1)
    using namespace std;
    
    inline int read(){
    	int x = 0, w = 1;
    	char ch = getchar();
    	for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
    	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    	return x * w;
    }
    
    inline void write(register int x){
    	if(x < 0) x = ~x + 1, putchar('-');
    	if(x > 9) write(x / 10);
    	putchar(x % 10 + '0');
    }
    
    const int ss = 5200;
    
    int n, m, ans, posx, posy;
    int a[ss], b[ss];
    int f[ss][ss], pre[ss][ss];
    
    inline void Print (register int i, register int j) {
    	if (i == 0) return;
    	Print (i - 1, pre[i][j]);
    	if (f[i][j] != f[i - 1][pre[i][j]]) {
    		write (b[j]), putchar (' ');
    	}
    }
    
    int main () {
    	freopen ("phoenix.in", "r", stdin);
    	freopen ("phoenix.out", "w", stdout);
    	n = read();
    	for (register int i = 1; i <= n; i ++) a[i] = read();
    	m = read();
    	for (register int i = 1; i <= m; i ++) b[i] = read();
    	for (register int i = 1; i <= m; i ++) {
    		if (a[1] == b[i]) f[1][i] = 1;
    	}
    	for (register int i = 1; i <= n; i ++) {
    		if (b[1] == a[i]) f[i][1] = 1;
    	}
    	for (register int i = 1; i <= n; i ++) {
    		register int maxx = 0, k = 0;
    		for (register int j = 1; j <= m; j ++) {
    			f[i][j] = f[i - 1][j], pre[i][j] = j;
    			if (b[j] < a[i] && maxx < f[i - 1][j]) maxx = f[i - 1][j], k = j;
    			if (a[i] == b[j]) f[i][j] = maxx + 1, pre[i][j] = k;
    			if (ans < f[i][j]) ans = f[i][j], posx = i, posy = j;
    		}
    	}
    	write (ans), putchar ('
    ');
    	Print (posx, posy), putchar ('
    ');
    	return 0;
    }
    
  • 相关阅读:
    流水线操作verilog
    16x16移位相加乘法器verilog实现
    Nios II对flash进行读写(DE2)
    initial使用的要点
    边沿检测电路设计verilog
    DDoS攻防战 (四):CC攻击防御系统部署
    DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现
    DDoS攻防战 (二) :CC攻击工具实现与防御理论
    DDoS攻防战 (一) : 概述
    IP流量重放与pcap文件格式解析
  • 原文地址:https://www.cnblogs.com/rui-4825/p/13809518.html
Copyright © 2011-2022 走看看