总结 :再次爆零╮(╯▽╰)╭,就当noip Rp++O(∩_∩)O~~
正常开始读题,T1这不是模拟吗,又看了看样例,感觉还行,T2 woc昨晚上刚学了exgcd,这张的好像exgcd啊,觉得可以搞。T3 smg 样例都看不懂哎,最后骗骗分放弃了。第二次回头去看T1,再读一遍还是暴力模拟,嗯,我想的能做O(n*m),看了看数据范围woc10^18 smg 这O(n) 也过不了啊 得O(1)啊 ,我哪会什么算法是O(1)啊,看60分数据3000,n^2的数据范围貌似可以的,我想的算法是O(n*m),(并没有意识到到错误其实到这我的想法就出现了一种常见的错误“想当然 。。。”) 我想的就是直接折叠后覆盖掉原来的序号,以后再折叠肯定没有被覆盖掉的了。事实上是我想错了,也可以再折叠覆盖掉的序号,因为这样的效果与在折叠覆盖掉的效果一样。可是我已经全修改了,全wa了。T2搞搞搞自己!!!感觉很正确其实不如30分的枚举╮(╯▽╰)╭。T3还是一脸懵逼让了多组数据也不好偏分就把样例丢上去了。
经验:
1 . 一切一题目描述为主,不要“想当然”。切记,切记,切记。
2 . 如果你的想法的时间复杂度 跟 数据范围差别大不在一档上 ,这个时候应该警觉想法是不是哪里出了问题。
3 . 注意数据范围如果n太大不能接受,考虑考虑m。
4 . 当你打一个你无法证明正确性,一定要先打暴力,因为在考场上打的算法正确性很低。最后很可能还不如暴力。
5 . 如果有一个题10分钟样例看不懂or没点思路。考虑选择性的放弃。
T1
【问题描述】
一张长度为?的纸带,我们可以从左至右编号为0 − ?(纸带最左端 标号为
0) 。 现在有?次操作, 每次将纸带沿着某个位置进行折叠, 问所有操作之后纸带
的长度是多少。
【输入格式】
第一行两个数字?, ?如题意所述。
接下来一行?个整数代表每次折叠的位置。
【输出格式】
一行一个整数代表答案。
【样例输入】
5 2
3 5
【样例输出】
2
【样例解释】
树上有只鸟。
【数据规模与约定】
对于60%的数据,?, ? ≤ 3000。
对于100%的数据,? ≤ 10^18, ? ≤ 3000。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL n,m;
LL xh[5000];
int main()
{
freopen("he.in","r",stdin);
freopen("he.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
scanf("%lld",&xh[i]);
LL l=0,r=n;
for(int i=1;i<=m;i++)
{
LL mid=(l+r)/2;
if(xh[i]<=mid)
{
for(int j=i+1;j<=m;j++)
{
if(xh[j]<xh[i])
xh[j]=xh[i]+(xh[i]-xh[j]);
}
l=xh[i];
}
else
{
for(int j=i+1;j<=m;j++)
{
if(xh[j]>xh[i])
xh[j]=xh[i]-(xh[j]-xh[i]);
}
r=xh[i];
}
}
printf("%lld",r-l);
fclose(stdin);
fclose(stdout);
return 0;
}
T2
【问题描述】
给你?, ?, ?, ?,求满足? ≤ (? × ?) ??? ? ≤ ?最小的正整数?。
【输入格式】
第一行一个数?代表数据组数。
接下来?行每行四个数代表该组数据的?, ?, ?, ?。
【输出格式】
对于每组数据,输出一行代表答案。如果不存在解,输出“−1” 。
【样例输入】
1
5 4 2 3
【样例输出】
2
【样例解释】
叫南小鸟。
【数据规模与约定】
对于30%的数据,保证有解且答案不超过10^6。
对于另外20%的数据,? = ?。
对于100%的数据,1 ≤ ? ≤ 100,0 ≤ ?, ?, ?, ? ≤ 10^9。
题解 :前百分之30枚举即可,之后L==R的用exgcd就行。剩下的不会了 QAQ。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
LL m,s,l,r,t;
LL x,y;
LL T;
void exgcd(LL a,LL b)
{
if(b==0)
{
x=1,y=0;
return ;
}
exgcd(b,a%b);
LL x2=x,y2=y;
x=y2;
y=x2-a/b*y2;
}
int main()
{
freopen("she.in","r",stdin);
freopen("she.out","w",stdout);
scanf("%lld",&T);
int aaa;
while (T!=0)
{
T--;
x=0,y=0;
scanf("%lld%lld%lld%lld",&m,&s,&l,&r);
if(l==r)
{
t=l;
if(t%__gcd(m,s)!=0|| m<=l)
printf("-1\n");
else
{
LL haha=t/__gcd(m,s);
exgcd(s,m);
x*=haha;
haha=m/__gcd(m,s);
while(x<0) x+=haha;
x%=haha;
printf("%lld\n",x);
}
}
else
{
for(LL i=1;i<=1000000;i++)
{
if(l<=s*i%m&&s*i%m<=r)
{
printf("%lld\n",i);
break;
}
}
}
}
fclose(stdin);
fclose(stdout);
return 0;
}