题面:

题解:

T1:

毕竟是tg膜你,不会太难

就是一道简单贪心

首先,对于a<=b的所有物品,一定是贪心的按照a从小到大放入。

先假设剩下的物品可以按照某种顺序放进去,那么可以得到一个最终空间(如果最终空间<0那么一定不可行)。

之后可以看成是从结束状态往回还原,还原一个物品需要扣掉b的空间,再加上a的空间,由于b>a所以是一个和前面一样的问题,按照b从小到大排序即可。

#include <bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
inline ll read()
{
register ll x=0,t=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();}
while('0'<=ch&&ch<='9')x=(x<<3)+(x<<1)+ch-48,ch=getchar();
return x*t;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int s[25];register int top=0;
while(x){s[top++]=x%10,x/=10;}
while(top)putchar(s[--top]+48);
}
struct node{
int cost,ret;
}a[N];
inline bool cmp1(register node a,register node b)
{
return a.cost<b.cost;
}
inline bool cmp2(register node a,register node b)
{
return a.ret>b.ret;
}
int t,n;
ll v;
inline void lxldl()
{
n=read(),v=read();
for(register int i=1;i<=n;++i)
a[i].cost=read(),a[i].ret=read();
sort(a+1,a+n+1,cmp1);
for(register int i=1;i<=n;++i)
if(a[i].cost<a[i].ret)
{
if(a[i].cost>v)
{
puts("No");
return;
}
v+=a[i].ret-a[i].cost;
a[i].ret=a[i].cost=0;
}
sort(a+1,a+n+1,cmp2);
for(register int i=1;i<=n;++i)
if(a[i].cost<=v)
v+=a[i].ret-a[i].cost;
else
{
puts("No");
return;
}
puts("Yes");
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
t=read();
while(t--)
lxldl();
return 0;
}

T2:

想着各种数据结构,结果是个膜你?

由于是循环位移,所以移动N次之后方案会循环,那么只要考虑前N次移动就可以了。如果把这个绝对值的符号分情况讨论,对于一个数,它在某几次循环位移的时候会使得答案+1,在某几次循环位移的时候会使得答案-1(从1移动到N的情况可以单独考虑),并且+1和-1的时刻分别是一段区间。那么可以维护每次移动后相对于上次的变化量,维护这个变化量的时候需要区间+1/-1,查询每个位置的和。可以使用线段树,但是是在所有操作之后进行询问,所以可以用差分。

#include<bits/stdc++.h>
#define maxn 2000010
#define ll long long
using namespace std;
ll pre[maxn];
int main()
{
freopen("b.in", "r", stdin);
freopen("b.out", "w", stdout);
ll sum = 0, res = 1e18;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
sum += abs(x - i);
if (x > i)
{
pre[1]++; pre[i]--;
pre[i] += abs(x - n) - abs(x - 1);
pre[i + 1] -= abs(x - n) - abs(x - 1);
int tmp = n - x + i;
pre[i + 1]--; pre[tmp + 1]++;
pre[tmp + 1]++; pre[n]--;
}
else
{
int tmp = i - x;
pre[1]--; pre[tmp + 1]++;
pre[tmp + 1]++; pre[i]--;
pre[i] += abs(x - n) - abs(x - 1);
pre[i + 1] -= abs(x - n) - abs(x - 1);
pre[i + 1]--; pre[n]++;
}
}
res = sum;
for (int i = 1; i <= n - 1; i++)
{
pre[i] += pre[i - 1];
sum += pre[i];
res = min(res, sum);
}
printf("%lld\n", res);
return 0;
}

T3:

写个打暴力都有70pts,想什么正解(smog

正解也很简单,就是个线段树qaq

分两种情况考虑,先考虑两个线段不相互包含的情况。枚举左端点靠左的那一条线段i,另一条线段j的要求是l[j]在l[i]到r[i]之间,并且产生的答案是(r[j]-l[i])-(r[i]-l[j]),化简一下就是(l[j]+r[j])-([i]+r[i])可以用线段树按照l[j]为关键字维护l[j]+r[j]的最大值。另一种情况就是两条线段包含,依然枚举左端点靠左的那一条线段i,发现另一条线段需要维护r[j]-l[j]的最大值,也是用一棵线段树即可。

···cpp

include <bits/stdc++.h>

define N 200005

using namespace std;

inline int read()

{

register int x=0,t=1;register char ch=getchar();

while(ch<'0'||ch>'9'){if(ch'-')t=-1;ch=getchar();}

while('0'<=ch&&ch<='9')x=(x<<3)+(x<<1)+ch-48,ch=getchar();

return x*t;

}

inline void write(register int x)

{

if(!x)putchar('0');if(x<0)x=-x,putchar('-');

static int s[25];register int top=0;

while(x){s[top++]=x%10,x/=10;}

while(top)putchar(s[--top]+48);

}

inline int Min(register int a,register int b)

{

return a<b?a:b;

}

inline int Max(register int a,register int b)

{

return a>b?a:b;

}

struct node{

int l,r;

}w[N];

inline bool cmp(register node a,register node b)

{

return a.lb.l?a.r>b.r:a.l<b.l;

}

int n,a[N<<1],m=0;

struct SegmentTree{

int minn[N<<4];

inline void init()

{

memset(minn,0x3f,sizeof(minn));

}

inline void pushup(register int x)

{

minn[x]=Min(minn[x<<1],minn[x<<1|1]);

}

inline void update(register int x,register int l,register int r,register int pos,register int v)

{

if(l==r)

{

minn[x]=Min(minn[x],v);

return;

}

int mid=l+r>>1;

if(pos<=mid)

update(x<<1,l,mid,pos,v);

else

update(x<<1|1,mid+1,r,pos,v);

pushup(x);

}

inline int query(register int x,register int l,register int r,register int L,register int R)

{

if(L<=l&&r<=R)

return minn[x];

int mid=l+r>>1;

int res=0x3f3f3f3f;

if(L<=mid)

res=Min(res,query(x<<1,l,mid,L,R));

if(R>mid)

res=Min(res,query(x<<1|1,mid+1,r,L,R));

return res;

}

}tr1,tr2;

int main()

{

freopen("c.in","r",stdin);

freopen("c.out","w",stdout);

n=read();

for(register int i=1;i<=n;++i)

{

w[i].l=read(),w[i].r=read();

a[++m]=w[i].l,a[++m]=w[i].r;

}

sort(w+1,w+n+1,cmp);

sort(a+1,a+1+m);

m=unique(a+1,a+1+m)-(a+1);

for(register int i=1;i<=n;++i)

{

w[i].l=lower_bound(a+1,a+1+m,w[i].l)-a;

w[i].r=lower_bound(a+1,a+1+m,w[i].r)-a;

}

tr1.init(),tr2.init();

int ans=0;

int x;

for(register int i=1;i<=n;++i)

{

x=tr1.query(1,1,m,w[i].r,m);

ans=Max(a[w[i].l]-a[w[i].r]-x,ans);

x=tr2.query(1,1,m,w[i].l,w[i].r);

ans=Max(a[w[i].l]+a[w[i].r]-x,ans);

tr1.update(1,1,m,w[i].r,a[w[i].l]-a[w[i].r]);

tr2.update(1,1,m,w[i].r,a[w[i].l]+a[w[i].r]);

}

write(ans);

puts("");

return 0;

}


#### 这场比赛很简单 #### 暴力分给的很足, #### 本能能ak的,最后我只有大众分100+50(BIT写挂)+70(暴力+剪枝)=220pts #### gsy他235,cyc好像245 #### 深深的感受到自己的弱小~

【题解】JSOIWC2019 Round2的更多相关文章

  1. SDOI2017 Round2 详细题解

    这套题实在是太神仙了..做了我好久...好多题都是去搜题解才会的 TAT. 剩的那道题先咕着,如果省选没有退役就来填吧. 「SDOI2017」龙与地下城 题意 丢 \(Y\) 次骰子,骰子有 \(X\ ...

  2. 【题解】JSOIWC2019 Round 5

    题面: 题解: T1: 算法1: 枚举每个灯塔的方向,并分别判断是否有解.时间复杂度O(K*4^K). 预计得分:50-70分 算法2: 不难发现,当k≥4的时候一定有解,将最靠左的两个下面的朝右上. ...

  3. 【题解】JSOIWC2019 Round4

    题面: https://files-cdn.cnblogs.com/files/yzhang-rp-inf/P13.gif https://files-cdn.cnblogs.com/files/yz ...

  4. 【题解】JSOIWC2019 Round3

    题面 题解: T1: 先对图进行染色,重新对联通快重新建图 根据四色定理,珂以得出这实际是一颗树 因为树的中心肯定是最佳的决策,所以答案就是树的直径/2(上取整) #include <bits/ ...

  5. 【题解】JSOIWC2019 Round1

    题面(T1变成5s(毒瘤出题人发现std超时了qaq)): 啥都不会qaq.但也送了不少分 题解: T1: 当T=0时直接异或前缀和,但T=1时就有点恶心 暴力能有80pts(防止大家爆零) 还珂以用 ...

  6. AHOI2013 Round2 Day2 简要题解

    第一题: 第一问可以用划分树或主席树在O(nlog2n)内做出来. 第二问可以用树状数组套主席树在O(nlog2n)内做出来. 我的代码太挫了,空间刚刚卡过...(在bzoj上) 第二题: 分治,将询 ...

  7. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...

  8. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

  9. JSOIWC2019游记

    世除我WC...都去广二了qaq,就我还在nj ycs至少也去了pkuwc啊 这个JSOIWC2019的内容看起来很水,进入条件简单,但窝啥都不会,肯定垫底 内容清单: 1.26 上午听机房dalao ...

随机推荐

  1. C# 求俩个正整数的最小公倍数和最大公约数

    C# 求俩个正整数的最小公倍数和最大公约数 1.公倍数.最小公倍数 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 翻开小学5年级下册PPT 1.1 ...

  2. js中级小知识2

    1.面向对象 js一开始就是写网页特效,面向过程的,作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能很差.所以作者就收到java和c的影响,往面向对象靠齐.js天生有一个Objec ...

  3. Python学习之旅(三十)

    Python基础知识(29):virtualenv virtualenv:用来为一个应用创建一套隔离的Python运行环境 比如,现有两个Python项目,一个是Python2.7的一个是Python ...

  4. ML.NET 0.9特性简介

    ML.NET 0.9已于上周发布,距离上次0.8版本的发布只有一个多月,此次增加的新特性主要包括特征贡献计算,模型可解释性增强,ONNX转换对GPU的支持,Visual Studio ML.NET项目 ...

  5. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  6. Mycat了解下

    首先说下,因为本身不怎么推荐中间件,所以我对这东西也只是了解,业内mycat用的最好的应该顺风算一个,但是他们是做过二次开发的,咱菜鸡比不了,据说最近出来一个叫cetus的还不错,有空可以关注下 Ⅰ. ...

  7. [qemu] qemu从源码编译安装

    环境:CentOS7-1804 下载最新的源码: ┬─[tong@T7:~/Src/thirdparty/PACKAGES]─[:: AM] ╰─>$ axel https://download ...

  8. 源码安装Nginx以及用systemctl管理

    一.源码安装Nginx: 先安装gcc编译器(安装过的可以忽略) [root@localhost ~]# yum -y install gcc gcc-c++ wget 进入src目录 [root@l ...

  9. 为什么mysql事务回滚后, 自增ID依然自增

    事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还 ...

  10. utf8 vs utf8mb4

    UTF-8 is a variable-length encoding. In the case of UTF-8, this means that storing one code point re ...