0%

思路讲解

https://www.luogu.com.cn/article/rae0b6wl

总体思路就是将等于目标转变为构造最小的 大于等于目标的构造

1
2
3
4
5
6
ROF(i,Q,1){
ll x=Op[i][0],y=Op[i][1],z=Op[i][2];
C[x]=max(C[x],C[z]);
C[y]=max(C[y],C[z]);
if(x!=z && y!=z) C[z]=0;
}

既然是要被覆盖的,我们还要构造最小的吗,所以我们令

AC代码

https://codeforces.com/contest/2115/submission/323143930

心路历程(WA,TLE,MLE……)

https://codeforces.com/contest/2115/submission/322643402

比最大条件小的点是不被允许的,那么填什么最好呢?

https://codeforces.com/contest/2115/submission/322665243

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
10 10
4 3 8 4 2 4 4 4 4 2
9 6 8
7 1 4
2 5 5
8 1 8
7 4 6
9 7 8
6 8 8
8 4 5
9 10 5
3 1 9

附随机数据生成器

https://www.cnblogs.com/cjcf/p/18906536

给出最后的结果和操作步骤,求初始数组

通过贪心,我们发现在A[x]有多条边的时候,只能选择满足最大的边(条件,边权为A[z]大小)

比最大条件小的点是不被允许的,那么我们就要看是就选这个最大条件还是选自己的值(如果自己的值比最大条件大)。

贪心的来说,如果自己的值是要被覆盖的,那么肯定选条件值,如果不被覆盖,那肯定就选自己的值。

当然,上面的这些只针对于不是多重覆盖的情况,如果出现多重覆盖情况,那么只保留最后覆盖情况(前面覆盖了也是白覆盖)。

那么我们发现,我们小瞧了这道题目,就是说操作之间是有可能互相影响的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
10 10
4 3 8 4 2 4 4 4 4 2
9 6 8
7 1 4
2 5 5
8 1 8
7 4 6
9 7 8
6 8 8
8 4 5
9 10 5
3 1 9

当然,我们发现我们的贪心结论是没有什么大的问题的,只是适用范围错了,其仅在倒推时,不涉及传递的时候有用。

思路讲解

https://www.luogu.com.cn/article/63o898db

如果说一个序列是1,2,3,4,5,……,N,还有一个序列无序,那么其实就选一个LIS就行。

那么现在前面这个序列不是有序的,但前面这个序列的标号是有序的,这个时候怎么搞?其实我们就定义新的顺序为A[1]<A[2]<A[3]……<A[N],就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
scanf("%lld",&N);
FOR(i,1,N) {scanf("%lld",&A[i]);posA[A[i]]=i;}
FOR(i,1,N) {scanf("%lld",&B[i]);}
vector<ll> dp;
FOR(i,1,N){
if(dp.empty()) dp.pb(posA[B[i]]);
else{
vector<ll>::iterator it=lower_bound(all(dp),posA[B[i]]);
if(it==dp.end()) dp.pb(posA[B[i]]);
else dp[it-dp.begin()]=posA[B[i]];
}
}
printf("%d\n",SZ(dp));

AC代码

https://www.luogu.com.cn/record/219257679

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

https://codeforces.com/contest/2115/submission/322474384

心路历程(WA,TLE,MLE……)

思路讲解

唉,要仔细审题,题目说了这是一个排列就好做很多。

AC代码

https://codeforces.com/contest/2116/submission/322330827

心路历程(WA,TLE,MLE……)

思路讲解

需要注意是工资第k多,而不是第k少。

AC代码

https://www.luogu.com.cn/problem/P1486

心路历程(WA,TLE,MLE……)