zoukankan      html  css  js  c++  java
  • R2 day2

    简单写一下吧

    emmmm,来晚了1h,没赶上,所以没交.......(捂脸

    T1

    开始读错题了诶
    开烤1.2h后
    发现是个傻逼题....
    排序一下,维护前缀最左,右端点
    随机数据我跑的比他们都慢..........

    #include<cstdio>
    #include<algorithm> 
    #define LL long long 
    const int maxn = 2000007; 
    struct node { 
    	int v,loc; 
    } a[maxn]; 
    bool cmp(node q,node b) { 
    	if(q.v == b.v) return q.loc <= b.loc; 
    	return q.v > b.v; 
    } 
    int n,m;
    int main() { 
    	freopen("w.in","r",stdin); freopen("w.out","w",stdout); 
    	LL ans = 0; scanf("%d",&n); 
    	for(int i = 1;i <= n;++ i) scanf("%d",&a[i].v), a[i].loc = i; 
    	std::sort(a + 1, a + n + 1,cmp); 
    	int l = a[1].loc,r = a[1].loc; 
    	ans = a[1].v; 
    	for(int i = 2;i <= n;++ i) { 
    		int k = a[i].loc; 
    		if(k < l) l = k; 
    		if(k > r) r = k; 
    		if(k >= l)ans = std::max(1ll * (k - l + 1) * a[i].v,ans); 
    		if(k <= r)ans = std::max(1ll * (r - k + 1) * a[i].v,ans); 
    	} 
     	printf("%I64d
    ",ans); 
        return 0;
    } 
    
    

    T2

    emmmm,推了一下式子
    发现这个

    所以只需要尽可能的合并就行了

    #include <cstdio> 
    int cnt[10000007]; 
    const int mod = 998244353; 
    #define LL long long 
    int main() {
        freopen("s.in","r",stdin);
        freopen("s.out","w",stdout);
        int n;
        scanf("%d",&n);
        int cnt[32] = {0}; 
        for(int i = 1;i <= n;i ++) { 
            int x; scanf("%d", &x); 
            for(int j = 0;j < 32;j ++) if(x & (1 << j)) cnt[j] ++; 
        } 
        LL ans = 0; 
        for(int i = 1;i <= n;i++) { 
            int x = 0; 
            for (int j = 0;j < 32;j ++) if (cnt[j]) x |= (1 << j), cnt[j] --; 
            ans = (ans + 1ll * x * x) % mod; 
        }   
        printf("%lld
    ",ans % mod); 
    
        return 0;
    }
    

    T3

    状压dp
    记录本行和上一行状态
    然后把可行状态抽出来就行了

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define LL long long
    const int mod = 1e9 + 7; 
    inline int read() { 
    	int x = 0; 
    	char c = getchar(); 
        while(c < '0' || c > '9')c = getchar(); 
        while(c <= '9'&& c >= '0')x = x * 10 + c - '0',c = getchar();return x;
    	return x; 
    } 
    int n,m,k; 
    const int maxn = 17; 
    int cant[maxn]; 
    bool judge(int s) { 
    	if((s & (s >> 1)) || (s & (s >> 2))) return false; 
    	return true; 
    } 
    int s[maxn]; 
    int id[maxn]; 
    int dp[maxn][407][407]; 
    int main() { 
      	n = read() , m= read() - 1,k = read(); 
      	for(int t,p,i = 1;i <= k;++ i) { 
      		t = read(),p = read() - 1; 
      		cant[t] |= (1 << p); 
      	} 
      	int T = (1 << m) - 1; 
      	int cnt = 0; 
      	for(int i = 0;i <= T;++ i) 
      		if(judge(i)) s[++ cnt] = i,s[i] = cnt; 
    	for(int i = 0;i <= T;++ i) dp[0][0][i] = 1; 
    	long long ans = 0; 
    	for(int i = 1;i <= n;++ i) { 
    		for(int s1 = 0; s1 <= T;++ s1) { 
    			if(cant[i] & s[s1]) continue; 
    			for(int s2 = 0;s2 <= (i <= 1 ? 1 : T);++ s2) { 
    				if(cant[i - 1] & s2 || ((s1 >> 1) & s2)  || ((s1 << 1) & s2) || (s1 & s2)) continue; 
    				for(int s3 = 0;s3 <= (i <= 2 ? 1 : T);++ s3) { 
    					if((s3 & s1) || (cant[i - 2] & s3) || ((s2 >> 1) & s3)  || ((s2 << 1) & s3) || (s2 & s3) ) continue; 
    					dp[i][s2][s1] += dp[i - 1][s3][s2]; 
    					dp[i][s2][s1] %= mod; 
    				} 
    				if(i == n) {ans += dp[i][s2][s1],ans %= mod;} 
    			} 
    		} 
    	} 
    	printf("%lld
    ",ans); 
    	return 0; 
    } 
    
  • 相关阅读:
    研究生毕业论文如何选题
    关于虚拟机中开vmnet1(host)后pc不能上网的问题解决
    ubuntu10.04安装x264库
    CentOS 5.5无法识别Atheros AR8151网卡问题解决
    dm365工作笔记20130731
    DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植
    SQL语法练习
    T-SQL查询语句常用优化技巧总结
    【转】Asp.net控件开发学习笔记整理篇
    【转】Asp.net控件开发学习笔记整理篇
  • 原文地址:https://www.cnblogs.com/sssy/p/9562418.html
Copyright © 2011-2022 走看看