好久没写blog&&比赛题解了,最近补一下

这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸。

Rating减。。。。。。链接不解释

好了我们开始看题。

A. 「THUPC 2017」玩游戏

看到这个题目是不是超级害怕蒟蒻看到THUPC瑟瑟发抖

然后我们仔细读一遍题,发现签到题get!

我们首先判断\(a+b\)是否可以表示为\(\sum_{i=1}^k i\)的形式

如果可以,我们就可以不断从\(k\)开始,如果\(a>=k\)那么就\(a-=k\)。这样可以保证正确性。

由于\(k=\sqrt{a+b}\),因此不会超时也不需要任何优化。

CODE

#include<cstdio>
using namespace std;
long long a,b,tot,cnt,ans[100005],num;
int main()
{
register long long i; scanf("%lld%lld",&a,&b);
for (i=1;;++i)
{
if ((tot+=i)==a+b) { num=i; break; }
if (tot>a+b) { printf("No"); return 0; }
}
for (i=num;i>=1;--i)
{
if (a>=i) a-=i,ans[++cnt]=i;
if (!a) break;
}
for (printf("%d ",num),i=cnt;i>1;--i)
printf("%d ",ans[i]); printf("%d",ans[1]);
return 0;
}

B. 「NOIP2017模拟赛11.02」Cover

一道非常玄学的好题,在CJJ dalao的不断教导下终于会了。

我们首先先把所有操作离线读进来,按修改的数来排序,如果相同就按序号排序。

然后我们发现所有数值一样的数就被排到一起去了。

接下来我们对于所有相同的数,修改时直接区间修改打个标记即可。

然后查找时只需要查找某个位置上最早被打上标记的时间即可。

看一下数据范围,发现不卡常(良心题),直接上线段树就艹过去了。

其实正解是\(O(n)\)的栈乱搞,但是我不会啊。

CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200005;
struct ques
{
int opt,x,y,z,id,ans;
}q[N];
struct segtree
{
int x,mark;
}tree[N<<2];
int n,m,h[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(int x)
{
if (x<0) putchar('-'),x=-x;
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline bool comp1(ques a,ques b)
{
if (a.z<b.z) return 1;
if (a.z>b.z) return 0;
return a.id<b.id;
}
inline bool comp2(ques a,ques b)
{
return a.id<b.id;
}
inline void down(int rt,int x)
{
if (tree[rt].mark)
{
if (q[h[tree[rt<<1].x]].z!=x) tree[rt<<1].x=tree[rt<<1].mark=tree[rt].mark;
if (q[h[tree[rt<<1|1].x]].z!=x) tree[rt<<1|1].x=tree[rt<<1|1].mark=tree[rt].mark;
tree[rt].mark=0;
}
}
inline void modify(int rt,int l,int r,int beg,int end,int id,int x)
{
if (l!=r) down(rt,x);
if (l>=beg&&r<=end) { tree[rt].mark=id; if (q[h[tree[rt].x]].z!=x) tree[rt].x=id; return; }
int mid=l+r>>1;
if (beg<=mid) modify(rt<<1,l,mid,beg,end,id,x);
if (end>mid) modify(rt<<1|1,mid+1,r,beg,end,id,x);
}
inline int query(int rt,int l,int r,int id,int x)
{
if (l==r) return tree[rt].x?tree[rt].x:-1;
int mid=l+r>>1; if (l!=r) down(rt,x);
if (id<=mid) return query(rt<<1,l,mid,id,x); else return query(rt<<1|1,mid+1,r,id,x);
}
inline void solve(int l,int r)
{
int t=q[l].z;
for (register int i=l;i<=r;++i)
if (q[i].opt) q[i].ans=query(1,1,n,q[i].x,t); else modify(1,1,n,q[i].x,q[i].y,q[i].id,t);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n); read(m);
for (i=1;i<=m;++i)
{
read(q[i].opt); q[i].id=i;
if (q[i].opt) read(q[i].x),read(q[i].z); else read(q[i].x),read(q[i].y),read(q[i].z);
}
sort(q+1,q+m+1,comp1);
for (i=1;i<=m;++i)
h[q[i].id]=i; int l,r=0; q[m+1].z=-1;
while (r<m)
{
l=++r; while (q[l].z==q[r+1].z) ++r;
solve(l,r);
}
sort(q+1,q+m+1,comp2);
for (i=1;i<=m;++i)
if (q[i].opt)
{
if (q[i].ans!=-1) write(q[q[i].ans].z!=q[i].z?-1:q[i].ans),putchar('\n');
else puts("-1");
}
return 0;
}

C. 「NOIP2017模拟赛11.02」统计岔道口

这道题是真的狗。让我怀疑人生。

由于我很,所以到现在都只会推平行的情况。

首先我们考虑只有平行时,那么最小值一定是\(0\)

这个很好理解吧,令它们全部平行即可。

那么最大值就是让第\(i\)条直线与之前的\(i-1\)条直线都相交。那么在没有任何限制的情况下,\(ans=\sum_{i=1}^{n-1}\)

然后考虑加入两条直线平行的操作时,我们直接把\(ans\)减去\(num[x]\cdot num[y]\)即可。其中\(num[x]\)表示与\(x\)平行的直线的数量(自己也算)

这样我们维护并查集即可。这里由于\(n\)的范围太大,所以map大法好。

30ptsCODE

#include<cstdio>
#include<map>
using namespace std;
map <int,int> num,father;
int n,m,opt,x,y;
long long ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(long long x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline int getfather(int k)
{
return father[k]==k?k:father[k]=getfather(father[k]);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
read(n); read(m); ans=(long long)n*(n-1)/2;
while (m--)
{
read(opt); read(x); read(y);
if (!opt)
{
if (!father[x]) father[x]=x,num[x]=1;
if (!father[y]) father[y]=y,num[y]=1;
int fx=getfather(x),fy=getfather(y);
if (fx!=fy) father[fx]=fy,ans-=(long long)num[fx]*num[fy],num[fy]+=num[fx];
write(ans); puts(" 0");
}
}
return 0;
}

EZ 2018 06 10 NOIP2018 模拟赛(十八)的更多相关文章

  1. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  2. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

  3. EZ 2018 06 02 NOIP2018 模拟赛(十七)

    这次的比赛是真心比较狗,我TM的写了30min的树剖ZZ地直接memset超时了 话说我既然想到差分就应该去写差分的啊! 好了不过这次Rank还挺高的,终于要打进前10了当然是假的了. 好了下面开始讲 ...

  4. EZ 2018 04 13 NOIP2018 模拟赛(八)

    这次的题目都是什么鬼? 玄学乱搞+肉眼看CODE+倒着搜索? 好吧是我ZZ了 链接在此 T1 玄学乱搞 由于考场上写的部分分做法忘记讨论n<=2000时的情况,少得了30pts 很容易得到一个基 ...

  5. EZ 2018 05 20 NOIP2018 模拟赛(十五)

    这次的比赛充满着玄学的气息,玄学链接 首先讲一下为什么没有第十四场 其实今天早上9点时看到题目就叫了:原题! 没错,整套试卷都做过,我还写了题解 然后老叶就说换一套,但如果仅仅是这样就没什么 但等13 ...

  6. EZ 2018 05 26 NOIP2018 模拟赛(十六)

    这次难道就是传说中的标准分大赛?而且这次比赛的链接不翼而飞了 一堆人153pts然后就有Rank4?看来这个Rank4不值钱了,才涨了50+的Rating. 不过还好最后5min的时候想出了T1正解, ...

  7. EZ 2018 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...

  8. EZ 2018 04 21 NOIP2018 模拟赛(十) -LoliconAutomaton的退役赛

    难得的一次Unrated,避免了重回1500的尴尬 其实题目都还可以,但只不过所有人T1都炸了,可能是数据的锅(假的) 而且我因为T1SB的把T2弃了,没想到是千年水题 T3莫名爆炸,然后TM的40分 ...

  9. EZ 2018 05 13 NOIP2018 模拟赛(十三)

    这次的比赛真心水,考时估分240,然后各种悠闲乱逛 然后测完T1数组开小了炸成40,T2,T3都没开long long,T2炸成20,T3爆0 掉回1600+的深渊,但是还有CJJ dalao比我更惨 ...

随机推荐

  1. loadrunner 场景设计-制定负载测试计划

    by:授客 QQ:1033553122 场景设计-制定负载测试计划 步骤1.分析应用程序 你应该对硬件和软件组建,系统配置和典型的使用场景很熟悉.这些应用程序的分析保证你在使用loadrunner进行 ...

  2. OpenCV 填充(ROI)+模糊操作

    1.ROI 操作 src = cv.imread('./1.jpg') cv.imshow('src',src) dst = src[40:240,100:300] gray = cv.cvtColo ...

  3. vue路由的配置

    一.准备工作 1安装vue-cli  npm install vue-cli -g 2检查是否安装成功 vue -V(大写V) 3初始化一个新的项目 vue init  webpack vue-dem ...

  4. Kotlin入门(11)江湖绝技之特殊函数

    上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数.内联函数.扩展函数.尾递归函数.高阶函数等等,因此本篇文章就 ...

  5. DirectX SDK (June 2010)安装错误S1023,解决方法

    转自:http://hi.baidu.com/rootcat/item/6730f15f85e2c1958c12ed81 DirectX SDK (June 2010)安装错误S1023,解决方法 导 ...

  6. [20171206]rman与truncate2.txt

    [20171206]rman与truncate2.txt --//上午测试发现truncate的表在做rman备份时还要做8个extents的备份.--//不知道自己的猜测是否正确,选择一个使用UNI ...

  7. mysql5.7如何修改密码以及密码如何忘记无密码登陆

    今天买了一台阿里云服务器,Centos7.3系统,环境是LAMP.学生价9.8元是真的很实惠了.然后想修改一下mysql服务器的密码(mysql版本5.7),结果操作失误,密码给忘记了,导致新旧密码都 ...

  8. ccf-20171203 Crontab问题

    这题有如下几个点要注意: 1.最开始输出的开始时间和截止时间,这里是不包含截止时间的. 2.月份和星期的英文表示是大小写任意的,并未规定必须是Sat这种形式. 3.星期天的数字标识是0. 我的思路是, ...

  9. 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())

    /*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...

  10. 第 15 章 位操作(fields)

    /*----------------------------------- fields.c -- 定义并使用字段 -----------------------------------*/ #inc ...