- 博客(333)
- 收藏
- 关注
原创 51nod 1831 小C的游戏
坑爹的题意。。。每次可以对这个石子堆拿走一个或者把这个石子堆分成等量的几份并只取其中一份(不能不变或只剩下一个)。【只取其中一份】,不是【去掉其中一份】。题解是这样的,但我总觉得很玄学。。。最简单的做法就是找规律了,直接搜一下就能获得所有的胜负态。仔细观察可以发现质数除了2和17就是败的,合数除了16,34和289都是赢的。感觉这样是不太科学的,那就来讲讲道理。我们
2017-07-24 15:42:37
327
原创 51nod 1610 路径计数
因为是无环图,所以可以用记忆化搜索做。可以根据公约数,将图拆成100个子图。由于有重复,所以再加上容斥。#includeusing namespace std;const long long mod=1e9+7;const int MAXM=50050;long long dp[110];int a[MAXM],b[MAXM],c[MAXM];int mat[110][1
2017-07-23 16:23:19
387
原创 51nod 1217 Minimum Modular
#includeusing namespace std;void read(int&a){ char ch;while(!((ch=getchar())>='0')&&(ch<='9')); a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';}const int MAXN=1000100;i
2017-07-20 14:43:24
271
原创 51nod 1385 凑数字
玄妙的方法。。。#includeusing namespace std;int main(){ string str; int ans,i,flag; while(cin>>str) { ans=(str.length()-1)*10; for(i=1;i<=9;i++) { if(str>=string(str.length(),i+'0'))
2017-07-19 14:35:49
311
原创 51nod 1293 球与切换器
DP//#include#include#includeusing namespace std;const int MAXN=1010;long long dp[MAXN][MAXN][2];int a[MAXN][MAXN];int main(){ long long k,tmp; int n,m,i,j; while(~scanf("%d%d%lld",&m,&n
2017-07-19 13:35:25
344
原创 51nod 1681 公共祖先
主席树,让我有点懵逼。。。//#include#include#includeusing namespace std;void read(int&a){ char ch;while(!((ch=getchar())>='0')&&(ch<='9')); a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=c
2017-07-18 16:55:06
370
原创 51nod 1461 稳定桌
用线段树查询区间k小和。#includeusing namespace std;const int MAXN=100100;int cnt[MAXN];struct Leg{ int l,d;}arr[MAXN];bool cmp(Leg l1,Leg l2){ return l1.l>l2.l;} struct node{ long long c,v;}
2017-07-15 16:51:27
373
原创 51nod 1424 零树
书上跑个DP。#includeusing namespace std;const int MAXN=100100;long long v[MAXN],add[MAXN],sub[MAXN];vector vec[MAXN];void dfs(int x,int fa){ for(int i=0;i<vec[x].size();i++) { if(vec[x][i]==f
2017-07-14 15:09:15
273
原创 51nod 1429 巧克力
水题#includeusing namespace std;int main(){ long long a1,a2,b1,b2,sum1,sum2,s1_2,s1_3,s2_2,s2_3,ans; while(~scanf("%lld%lld%lld%lld",&a1,&b1,&a2,&b2)) { sum1=a1*b1; sum2=a2*b2; s1_2=s1_3=
2017-07-14 14:49:54
258
原创 51nod 1525 重组公司
维护一个数组pre[i],表示比i小且与i属于不同组的最大值。//#include#includeusing namespace std;void read(int&a){ char ch;while(!((ch=getchar())>='0')&&(ch<='9')); a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a
2017-07-14 14:32:18
317
原创 51nod 1806 wangyurzee的树
purfer sequence的应用#includeusing namespace std;const long long mod=1e9+7;const int MAXN=1000100;long long fac[MAXN],inv[MAXN];long long powmod(long long x,long long p){ long long ret=1; whi
2017-07-14 13:33:43
138
原创 51nod 1275 连续子段的差异
#includeusing namespace std;const int MAXN=50050;int a[MAXN];deque dpmin,dpmax;int main(){ int n,k,i,j; long long ans; while(~scanf("%d%d",&n,&k)) { for(i=1;i<=n;i++) scanf("%d",&a[i]
2017-07-12 18:57:50
327
转载 51nod 1962 区间计数
#includeusing namespace std;const int MAXN=400400;pair p[MAXN],q[MAXN];int a[MAXN],b[MAXN],ra[MAXN],rb[MAXN];int ins(pair x,pair y)//计算区间并的大小 { if(x.second>y.second) swap(x,y); if(x.second
2017-07-12 15:47:30
354
原创 GYM 2015 ACM Syrian Collegiate Programming Contest
题目链接:http://codeforces.com/gym/101086AMy Friend of MiseryBBrother LouieC EverythingD Secure but TrueE Going in CirclesF Hey JUDgEG Paradise City
2017-07-12 12:47:35
523
转载 51nod 1451 合法三角形
由于xy范围比较小,所以可以枚举斜率进行计算。#includeusing namespace std;const int MAXN=2020;const int inf=0x3f3f3f3f;const double eps=1e-6;long long x[MAXN],y[MAXN];double slope[MAXN*MAXN];int main(){ long lo
2017-07-11 10:10:07
445
原创 51nod 1705 七星剑
期望DP转移,正着来。#includeusing namespace std;const int MAXN=110;const double eps=1e-8;const double INF=1e100;double prob[10][MAXN],suc[10],c[MAXN],dp[10][MAXN];int lose[10][MAXN];int main(){ in
2017-07-11 10:08:41
385
原创 51nod 1765 谷歌的恐龙
挺神奇的题目,最快一个人6s过题,第二个人50s过题。。。。设m个数的和,为sum1,剩下n-m个数的和为sum2。然后算期望,可以得到,从n-m个数中获得的分数的期望为sum2/m。然而,从m个数中获得的分数的期望为sum1/m所以,输入的那些a[i],完全没有什么用。。。。#includeusing namespace std;int main(){ long l
2017-07-07 15:13:11
328
原创 51nod 1444 破坏道路
BFS计算任意两点间的距离,N方枚举重合路径的两端。#includeusing namespace std;const int MAXN=3030;struct node{ int x,step;}now,son;vector vec[MAXN];int mp[MAXN][MAXN];void bfs(int x){ queue q; now.x=x; now
2017-07-07 14:37:09
326
原创 51nod 1131 覆盖数字的数量
可取的区间,为[a,b],[2a,2b],[3a,3b]……存在一个k,使得[ka,kb]与[(k+1)a,(k+1)b)]相连,即kb>=(k+1)a-1。找出k,然后其他各种特判即可。有一点麻烦。//#include#include#include#include#includeusing namespace std;int main(){ long lon
2017-07-06 15:47:02
257
原创 51nod 1349 最大值
单调栈瞎搞一下就好了//#include#include#include#include#includeusing namespace std;const int MAXN=100100;long long a[MAXN],bef[MAXN],aft[MAXN],ans[MAXN],stk[MAXN];int main(){ long long n,i,k,cnt,q;
2017-07-05 16:14:25
411
1
原创 51nod 1717 好数
只有完全平方数会操作奇数次//#include#include#include#include#includeusing namespace std;int main(){ long long n,ans; while(~scanf("%lld",&n)) { ans=sqrt(n); printf("%lld\n",n-ans); }}
2017-07-04 17:20:17
305
原创 51nod 1799 二分答案
写个类似的递归过程,以k为目标数。计算阶乘的时候,打表水过。。。//#include#include#include#include#includeusing namespace std;const long long mod=1e9+7;long long a[110]={1,682498929,491101308,76479948,723816384,67347853
2017-07-04 17:11:04
312
原创 51nod 1804 小C的多边形
a[i]=ib[n-1]=1b[]的其他值,可以直接算出来。//#include#include#include#include#includeusing namespace std;const int MAXN=1000100;int a[MAXN],b[MAXN];inline void prin_d(int x){ if (x > 9) {
2017-07-04 16:38:25
235
原创 51nod 1718 Cos的多项式
用x=π/3带入可得。。。。详细证明方式:Tabris_的博客//#include#include#include#include#includeusing namespace std;int main(){ long long n; while(~scanf("%lld",&n)) { n%=6; if(n==0) printf("2\n"); e
2017-07-04 13:54:38
438
原创 51nod 1675 序列变换
莫比乌斯反演的题目。 设 f(k)f(k)为满足abx=baya_{b_x}=b_{a_y}的情况下,gcd(x,y)=kgcd(x,y)=k的数量。 F(k)F(k)为满足abx=baya_{b_x}=b_{a_y}的情况下,gcd(x,y)=k的倍数gcd(x,y)=k的倍数的数量。 则 F(k)=∑k|df(d)F(k)=\sum_{k|d} f(d) 由莫比乌斯反演第二种形式,得
2017-07-03 17:47:26
352
原创 BZOJ2301 Problem b
莫比乌斯反演+容斥+分块优化莫比乌斯反演学习资料:POPOQQQ的莫比乌斯反演论文那篇论文提及了莫比乌斯反演的第一种形式,另外一种形式可以看莫比乌斯反演定理证明(两种形式)做这道题时,参考了【莫比乌斯反演】[HYSBZ/BZOJ2301]Problem b这篇题解里,感觉莫比乌斯反演的推算部分,i和d弄错了,但是之后的分块优化以及代码是对的。可能博主没注意。//#inclu
2017-07-03 16:53:57
332
原创 51nod 1580 铺管道
分三种情况讨论:1.直线2.折一次的折线3.折2次的折线有点麻烦的题//#include#include#includeusing namespace std;const int MAXN=2020;char mp[MAXN][MAXN];int dp[4][MAXN][MAXN],cdp[2][MAXN][MAXN];int main(){ long lon
2017-06-27 22:34:47
287
原创 51nod 1574 排列转换
求出每一位,移到正确位置,所需的代价和。由于是交换,代价和除以2。要用long long#includeusing namespace std;const int MAXN=200200;long long pos[MAXN];int main(){ long long n,i,ans,x; while(~scanf("%lld",&n)) { ans=0; f
2017-06-26 19:20:14
388
原创 51nod 1875 丢手绢
预处理打表#includeusing namespace std;int main(){ long long i,j,k,kk,g,ans[20],tmp,flag,last,used[30],now; for(i=1;i<=13;i++) { ans[i]=i+1; for(;;) { now=1; flag=1; memset(used,0,si
2017-06-26 16:07:50
256
原创 51nod 1873 初中的算术
#includeusing namespace std;string multi(string a,string b){ int i,j,arr[200],len=a.length()+b.length(); memset(arr,0,sizeof(arr)); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); for
2017-06-26 14:13:41
958
原创 51nod 2006 飞行员配对(二分图最大匹配)
裸题#includeusing namespace std;int n,m,mp[505][505],match[505],used[505];bool find(int x){ int i,j; for(j=1;j<=m;j++) { if(mp[x][j] && used[j]==0) { used[j]=1; if(match[j]==-1||fin
2017-06-26 13:44:14
567
原创 51nod 1557 两个集合
开2倍n的并查集。其中,i所在的并查集与i+n所在的并查集,分别表示与数字p[i]所在的集合,以及数字p[i]所不在的集合。也就是说,在正常情况下,i所在的并查集与i+n所在的并查集,不是同一个并查集。利用map,对于每一个p[i],查找a-p[i]以及b-p[i]的元素下标i1和i2根据查找情况,分别对i以及i+n进行并查操作。若找到i1和i2,且都不为i,则代表,a-p[i]与
2017-06-17 22:26:30
306
原创 51nod 1572 宝岛地图
预处理每个点,分别能往四个方向各走多少步。#includeusing namespace std;const int MAXN=1010;const int MAXM=100100;char mp[MAXN][MAXN];int dp[4][MAXN][MAXN];int chx[30],chy[30],suc[30];char dir[MAXM];int len[MAXM
2017-06-17 20:59:58
278
原创 51nod 1562 玻璃切割
之前连续好几天没怎么睡,还好没得道成仙。。。ddl是第一生产力。。。找了道水题做下。倒序处理所有答案,再输出。用可以用并查集进行合并区间操作(一开始想写伪链表的,发现好像不行)。不断更新横纵最大值即可。#includeusing namespace std;void read(int &a){ char ch;while(!((ch=getchar())>='0')
2017-05-03 22:22:14
691
原创 CCCC天梯赛 L3-015. 球队“食物链”
哈密顿回路问题,很经典。(但弱鸡的我,第一次做哈密顿回路的题。。。。)这题有坑,比赛的时候被坑了两个点,6分WA掉了。比赛采用主客场双循环赛制,也就是说,可能出现A赢了B,B也赢了A,或者A输给了B,B也输给了A的情况。神坑。。。然后单纯的dfs,会T。比赛的时候8分T掉了。。。首先,因为要输出字典序最小。因此,可以直接从1开始搜索。如果搜不到,那么从其他点也是搜不到的。然
2017-03-28 18:56:05
657
原创 CCCC天梯赛 L3-014. 周游世界
本质是个dijkstra的裸题,但是特别的烦。。。。由于图很复杂,所以不要一开始就将所有可相互到达的点连边,而是在dijkstra跑的时候,查询bus路线,再连边。然后压入优先队列的时候,以及弹出的时候,要判断下是否比当前最优解差,是的话就continue。因为要输出路径,所以还有存from节点。总之,特别的烦。。。#include using namespace std;
2017-03-28 18:03:47
1149
原创 CCCC天梯赛 L3-013. 非常弹的球
看到大家好像都写了这道题的题解,那我也来写一份。。。首先,有这么一个定理:在水平地面上,斜抛一个球,不考虑空气阻力的情况下,45°投掷,能投掷得最远。若不是水平地面,则视地面坡度,其最优角度也不一样。定理证明,可以设个落地点距离函数,角度为变量,初速度等为常量,求个导数就能得到最优角度了。这里就不证明了。(没错,就是因为我懒得写)然后,可以得到以下式子:速度与能量的关系:v =
2017-03-28 16:13:29
725
原创 51nod 1712 区间求和
在区间[i,j]内,元素a[x]对答案的贡献,为a[x]*(2*x-i-j)。然后通过一堆迷之前缀操作,就能得到答案了。。。//#include #include #include#include #include using namespace std;void read(unsigned int&a){ char ch;while(!((ch=getchar())
2017-03-27 19:19:58
397
原创 51nod 1785 数据流中的算法
好久没做题了,不由想到胡适先生的日记“无事。打牌。天稍稍凉矣。”而我王者农药喝多了。。。这周花了一星期的时间,把这学期的课程补了,但还差unity shader没自学。废话到这里吧。。。题目很简单,但有坑。。输出平均数时,只要保留整数部分,小数部分为.00。其他的,按正常double计算即可。//#include #include #include#inclu
2017-03-24 20:16:49
574
原创 51nod 1821 最优集合
如果现在能得到[1,t]范围内的任意值。若新来了一个数x,x利用这个性质,O(T*(N+M))时间处理下就行了。(膜zhenhao大佬)#include using namespace std;void read(int&a){ char ch;while(!((ch=getchar())>='0')&&(ch<='9')); a=ch-'0';while(((c
2017-03-15 20:29:38
402
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人