随机挑战总结 Part2
前言
随机挑战 算是放弃了,10天才写完题目。。。
这次和 WYCdalao 和 XXYdalao 又进行了一次随机挑战。
这次是每人在洛谷上随机跳3道蓝题。
结果两位大爷吊打我,比我早了完成。
还是太菜了。
题目
另外两位大爷的随机挑战总结:WYCdalao : XXYdalao
差分好题,码量小的一批。
傻逼+高精题,码量较小。
**题,纯裸的线段树模板,还没有修改操作。居然被评蓝了。。。
题解
T1 三步必杀
T2
T3 洞穴里的牛之二
没有写题解。。。线段树模板有什么好写的。。。
或者就放一个线段树模板的链接?
代码
T1
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e7+10;
int n,m,l,r;
ll a[N],sum[N],add,x,y,ans1,ans2;
ll read()
{
ll d=0;
char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch))
d=(d<<3)+(d<<1)+ch-48,ch=getchar();
return d;
}
int main()
{
n=(int)read(); m=(int)read();
for (int i=1;i<=m;i++)
{
l=(int)read(); r=(int)read(); x=read(); y=read();
add=(y-x)/(ll)(r-l);
a[l]+=x;
a[l+1]+=add-x;
a[r+1]-=add+y;
a[r+2]+=y;
}
for (int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
a[i]=a[i-1]+sum[i];
ans1^=a[i];
ans2=max(ans2,a[i]);
}
printf("%lld %lld\n",ans1,ans2);
return 0;
}
T2
#include <queue>
#include <cstdio>
using namespace std;
const int N=10010,M=200;
int n,a[N];
bool hash[N],flag;
struct node
{
int a[M+1],p,len;
}ans1,ans2;
queue<node> q;
node xx;
void bfs()
{
xx.len=1; xx.a[1]=1; xx.p=1; q.push(xx);
hash[1]=1;
while (q.size())
{
node u=q.front();
q.pop();
if (!u.p)
{
ans1=ans2=u;
return;
}
for (int i=0;i<=1;i++)
{
int p=(u.p*10+i)%n;
if (!hash[p])
{
hash[p]=1;
node v=u;
v.len++;
v.a[v.len]=i;
v.p=p;
q.push(v);
}
}
}
}
int main()
{
scanf("%d",&n);
if (n==1) return !printf("1 1\n");
bfs();
for (int i=1;i<=ans1.len;i++)
{
a[i]=ans1.a[i]/n;
ans1.a[i+1]+=ans1.a[i]%n*10;
}
int i=1;
while (!a[i]) i++;
for (;i<=ans2.len;i++) printf("%d",a[i]);
putchar(32);
for (i=1;i<=ans2.len;i++) printf("%d",ans2.a[i]);
return 0;
}
T3
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=25010;
int n,m,a[N],l,r;
struct Tree
{
int l,r,minn;
}tree[N*4];
void build(int x)
{
if (tree[x].l==tree[x].r)
{
tree[x].minn=a[tree[x].l];
return;
}
int mid=(tree[x].l+tree[x].r)/2;
tree[x*2].l=tree[x].l;
tree[x*2].r=mid;
tree[x*2+1].l=mid+1;
tree[x*2+1].r=tree[x].r;
build(x*2); build(x*2+1);
tree[x].minn=min(tree[x*2].minn,tree[x*2+1].minn);
}
int ask(int x,int l,int r)
{
if (l==tree[x].l && r==tree[x].r)
return tree[x].minn;
int mid=(tree[x].l+tree[x].r)/2;
if (r<=mid) return ask(x*2,l,r);
if (l>mid) return ask(x*2+1,l,r);
return min(ask(x*2,l,mid),ask(x*2+1,mid+1,r));
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
tree[1].l=1; tree[1].r=n;
build(1);
while (m--)
{
scanf("%d%d",&l,&r);
printf("%d\n",ask(1,l,r));
}
return 0;
}