Link:

Codeforces #174 传送门

A:

求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质

如果要确定哪些是原根的话还是要枚举,不过对于每个数不用枚举$p$次了

由于$\delta_p(x) | \phi(x)$,只要对欧拉函数值的约数枚举即可

不过此题好像直接$O(p^2)$枚举就行了……

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
int p,res; int main()
{
scanf("%d",&p);
for(int i=;i<p;i++)
{
bool f=;int t=;
for(int j=;j<=p-;j++)
{
t=(t*i)%p;
if(t==) f=;
}
if(t*i%p!=) f=;
res+=f;
}
printf("%d",res);
return ;
}

Problem A

B:

简单分类

#include <bits/stdc++.h>

using namespace std;
int n,A,I;char s[]; int main()
{
scanf("%d%s",&n,s+);
for(int i=;i<=n;i++)
if(s[i]=='A') A++;
else if(s[i]=='I') I++;
if(!I) printf("%d",A);
else if(I==) printf("");
else printf("");
return ;
}

Problem B

C:

明明写起来很简单的一道题目被我弄复杂了

考虑维护序列中原来的值和增量

由于只要求当前最后一个数的增量,因此可以每次仅在增加的最后一个数打上标记

这样在删除数时将当前末尾的增量向前推就能满足要求

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
int n,det[MAXN],dat[MAXN],lst;double sum; int main()
{
scanf("%d",&n);
dat[]=;lst=;
while(n--)
{
int op,x,y;
scanf("%d",&op);
if(op==) scanf("%d%d",&x,&y),sum+=x*y,det[x]+=y;
else if(op==) scanf("%d",&x),sum+=x,dat[++lst]=x;
else sum-=dat[lst]+det[lst],det[lst-]+=det[lst],det[lst--]=;
printf("%.6lf\n",sum/lst);
}
return ;
}

Problem C

结果我这个zz用树状数组维护了这个东西,还将一个增量写成了赋值WA了好几次……

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
int n;ll bit[MAXN<<],dat[MAXN<<],lst,sum; void Update(int pos,int x)
{while(pos<=n) bit[pos]+=x,pos+=pos&(-pos);}
ll Query(int pos)
{ll ret=;while(pos) ret+=bit[pos],pos-=pos&(-pos);return ret;} int main()
{
scanf("%d",&n);
lst=;sum=;
for(int i=;i<=n;i++)
{
int op,x,y;
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);
Update(,y);Update(x+,-y);
dat[]+=y;dat[x+]-=y;
sum+=x*y;
}
else if(op==)
{
scanf("%d",&x);
Update(lst+,x);Update(lst+,-x);
dat[++lst]+=x;dat[lst+]=-x;
sum+=x;
}
else
{
sum-=Query(lst);
Update(lst+,-dat[lst+]);
Update(lst,dat[lst+]);
dat[lst]+=dat[lst+];dat[lst+]=;lst--;
}
printf("%.6lf\n",1.0*sum/lst);
}
return ;
}

Problem C

D:

可以发现真正的状态数只有$2*n$个,对于每一位只有加/减两种状态

发现$y$的值就是走过的总距离,这样用$dp[n][2]$记忆化搜索在当前状态走到边界有多远

每个状态在入栈时打上标记,如果再次走到形成环就是循环了

这样对于每个$i$就是对应于$dp[i+1][0]$时的解

注意将边界$dp[1][0/1]$设为-1

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
int n,dat[MAXN],vis[MAXN][];ll dp[MAXN][]; ll dfs(int x,int d)
{
if(x<=||x>n) return ;
if(vis[x][d]==) return -;
if(vis[x][d]==) return dp[x][d];
vis[x][d]=;
ll dist=d?dfs(x+dat[x],):dfs(x-dat[x],);
vis[x][d]=;
if(dist==-) return dp[x][d]=-;
else return dp[x][d]=dist+dat[x];
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
vis[][]=vis[][]=;
for(int i=;i<=n;i++)
{
if(!vis[i][]) dfs(i,);
printf("%I64d\n",dp[i][]==-?-:i+dp[i][]-);
}
return ;
}

Problem D

E:

由于每个点只有一个后继,因此最终图只有环和链

将环的情况排除后就只剩链了

对于一条链,一个可行解为$a_1*w_1+a_2*w_2...+a_n*w_n(a_1>a_2>...>a_n)$

但由于后面的限制条件不能直接背包,考虑将式子变换后消除限制:

设$d_i=a_i-a_{i-1},suf_i=w_i+w_{i+1}...+w_n$,

这样式子变为$d_1*suf_1+d_2*suf_2...+d_n*suf_n$

发现就是一个完全背包,且可以将各个链合并在一起考虑

但注意,这个背包要求$d_1,d_2...d_{n-1}>0$,否则无法保证条件成立

也就是原式每个物品的个数要达到${n-1,n-2...2,1,0}$的下限!

这样就先都取一个,并将其从$t$中减去再跑背包即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,MOD=1e9+;
int n,q,t,x,y,a[MAXN],nxt[MAXN],d[MAXN],dp[MAXN],cnt; int main()
{
scanf("%d%d%d",&n,&q,&t);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=q;i++)
scanf("%d%d",&x,&y),nxt[x]=y,d[y]++;
for(int i=;i<=n&&t>=;i++)
{
if(d[i]) continue;
int sum=;//t<0一定要及时退出!
for(int j=i;j&&t>=;j=nxt[j])
{
cnt++;
sum+=a[j];a[j]=sum;
if(nxt[j]) t-=a[j];
}
}
if(cnt<n||t<) return puts(""),; dp[]=;
for(int i=;i<=n;i++)
for(int j=a[i];j<=t;j++)
(dp[j]+=dp[j-a[i]])%=MOD;
printf("%d",dp[t]);
return ;
}

Problem E

同时还有一个注意点:$t<0$时要及时退出否则会爆$int$

[Codeforces #174] Tutorial的更多相关文章

  1. [Codeforces #172] Tutorial

    Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...

  2. [Codeforces #514] Tutorial

    Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...

  3. [Codeforces #210] Tutorial

    Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...

  4. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  5. [Codeforces #190] Tutorial

    Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...

  6. [Codeforces #211] Tutorial

    Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...

  7. [Codeforces #192] Tutorial

    Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...

  8. [Codeforces #201] Tutorial

    Link: 传送门 代码量很少的一套思维题 A: 试一试发现最后状态一定是所有$min,max$间$gcd$的倍数 直接判断数量的奇偶性即可 #include <bits/stdc++.h> ...

  9. [Codeforces #188] Tutorial

    Link: Codeoforces #188 传送门 A: 先全转为正数,后面就全是指数级增长了 #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. 【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    [题意]公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地. [算法]贪心+堆 [题解]线段和点的贪心,一般有按左端点排序和按右端点排序两种方法 ...

  2. 【bzoj】1927 [Sdoi2010]星际竞速

    [算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...

  3. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing (拓扑排序+假dp)

    题目链接:https://nanti.jisuanke.com/t/16957 题目: In this winter holiday, Bob has a plan for skiing at the ...

  4. Eclipse连接海马模拟器

    找到海马模拟器安装目录: 使用cmd 命令进入命令行:D: cd:D:\Program Files (x86)\Droid4X 进入模拟器所在目录 运行adb connect 127.0.0.1:26 ...

  5. Spring Boot:定制自己的starter

    在学习Spring Boot的过程中,接触最多的就是starter.可以认为starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boo ...

  6. 【OneNote】使用线性格式输入数学公式

    在OneNote中按Alt+=,就可以开始输入公式. # 对齐公式数组 可以使用@和&来实现,如 \eqarray(x+1&=2@1+2+3+y&=z@3/x&=6)& ...

  7. nfs 文件共享 服务

    需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...

  8. sicily 1012. Stacking Cylinders & 1206. Stacking Cylinders

    Time Limit: 1sec    Memory Limit:32MB  Description Cylinders (e.g. oil drums) (of radius 1 foot) are ...

  9. c basic library framework - simplec 2.0.0

    前言 - simplec 单元测试 流程介绍 一个关于C基础库 simplec 2.0.0 发布了. 详细的文档介绍请参照 README.md. 说的再多都无用, 抵不上 gdb 一个 b r n. ...

  10. apache加入chkconfig

    #First Step: cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd #Second Step: vim /etc/init.d/htt ...