码迷,mamicode.com
首页 > 其他好文 > 详细

【tyvj五月有奖赛 暨Loi 55 Round #1】

时间:2015-05-01 09:19:40      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

解题报告:


  傻逼错误天天犯QAQ

  第一题:简单DP,f[i][j]表示第 i 道题选 j 的最大得分,可以从f[i-1][j-1],f[i-1][j],f[i-1][j+1]转移过来,其实是可以滚动数组优化空间的,不过懒得弄了=。=反正能过

技术分享
 1 //TYVJ A
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 using namespace std;
12 
13 int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<0||ch>9) {if (ch==-) sign=-1; ch=getchar();}
16     while(ch>=0&&ch<=9) {v=v*10+ch-0; ch=getchar();}
17     return v*sign;
18 }
19 typedef long long LL;
20 const int N=500010,INF=~0u>>2;
21 /*******************template********************/
22 int n,a[N],c[N],f[N][6];
23 int main(){
24 #ifndef ONLINE_JUDGE
25     freopen("input.txt","r",stdin);
26 //    freopen("output.txt","w",stdout);
27 #endif
28     n=getint();
29     char s[3];
30     F(i,1,n){
31         scanf("%s",s);
32         a[i]=s[0]-A+1;
33         c[i]=getint();
34     }
35     F(i,1,n) F(j,1,4){
36         f[i][j]=max(f[i-1][j-1],max(f[i-1][j],f[i-1][j+1]))+
37             (j==a[i]?c[i]:0);
38     }
39     int ans=0;
40     F(j,1,4) ans=max(f[n][j],ans);
41     printf("%d\n",ans);
42     return 0;
43 }
View Code

  第二题:数论题:求$$\sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)是无平方因子的数]*gcd(i,j)$$

  昂……蒟蒻实在太弱了就爆零了= =

 

  第三题:询问到树上两点距离$\leq K$的点的个数,强制在线。

  = =蒟蒻实在太弱,只能捡上白送的60分跑。

  60分做法:$n\leq 1000$,所以$n^2$的做法即可,那么处理出来dist[i][j]即任意两点间的距离,每次查询O(n)枚举即可,因为是树上距离,所以以每个点为根dfs一次即可求出dist[i][j]。

  第四题:太神了不会做,听说要用FWT?

  第五题:经典毒瘤题= =(神犇们都说是大水题Orz)因为取模每次必然使数折半,所以每个数最多取模log(a[i])次,那么每个数可以视为一开始有log(a[i])的能量,每次取模能量-1,单点修改可以视为给这个数重新充能。

  所以只要用线段树维护区间最大值(便于确定哪些数不用取模)和区间和,每次取模时在线段树上一路走到叶子进行修改,就可以AC啦~

  我是SB:每次query之前忘记把ans清零了!!!!f**k,一句话爆零系列。

技术分享
 1 //TYVJ E
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 using namespace std;
12 typedef long long LL;
13 LL getLL(){
14     LL v=0,sign=1; char ch=getchar();
15     while(ch<0||ch>9) {if (ch==-) sign=-1; ch=getchar();}
16     while(ch>=0&&ch<=9) {v=v*10+ch-0; ch=getchar();}
17     return v*sign;
18 }
19 
20 const int N=100010,INF=~0u>>2;
21 /*******************template********************/
22 
23 LL mx[N<<2],sum[N<<2],a[N],n,m;
24 #define L (o<<1)
25 #define R (o<<1|1)
26 #define mid (l+r>>1)
27 void maintain(int o,int l,int r){
28     if (l==r) return;
29     mx[o]=max(mx[L],mx[R]);
30     sum[o]=sum[L]+sum[R];
31 }
32 void build(int o,int l,int r){
33     if (l==r) {
34         sum[o]=mx[o]=a[l];
35     }else{
36         build(L,l,mid);
37         build(R,mid+1,r);
38         maintain(o,l,r);
39     }
40 }
41 void update(int o,int l,int r,int pos,LL v){
42     if (l==r) a[l]=mx[o]=sum[o]=v;
43     else{
44         if (pos<=mid) update(L,l,mid,pos,v);
45         else update(R,mid+1,r,pos,v);
46         maintain(o,l,r);
47     }
48 }
49 int ql,qr;
50 void modify(int o,int l,int r,LL x){
51     if (ql>r || qr<l) return; 
52     if (mx[o]<x) return;
53     if (l==r) a[l]=mx[o]=sum[o]=a[l]%x;
54     else{
55         modify(L,l,mid,x);
56         modify(R,mid+1,r,x);
57         maintain(o,l,r);
58     }
59 }
60 LL ans;
61 void query(int o,int l,int r){
62     if (ql<=l && qr>=r) ans+=sum[o];
63     else{
64         if (ql<=mid) query(L,l,mid);
65         if (qr>mid) query(R,mid+1,r);
66     }
67 }
68 int main(){
69 #ifndef ONLINE_JUDGE
70     freopen("E.in","r",stdin);
71 //    freopen("output.txt","w",stdout);
72 #endif
73     n=getLL(); m=getLL();
74     F(i,1,n) a[i]=getLL();
75     build(1,1,n);
76     LL cmd,l,k,x;
77     F(i,1,m){
78         cmd=getLL(); l=getLL(); k=getLL();
79         if (cmd==1){
80             ql=l; qr=k; ans=0;
81             query(1,1,n);
82             printf("%I64d\n",ans);
83         }else if (cmd==2){
84             x=getLL();
85             ql=l; qr=k;
86             modify(1,1,n,x);
87         }else{
88             update(1,1,n,l,k);
89         }
90     }
91     return 0;
92 }
View Code

 

【tyvj五月有奖赛 暨Loi 55 Round #1】

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4470348.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!