T1:

求出前缀和,三维偏序O(nlog2n)CDQ

二维其实就可以

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+,inf=;
int n,ans,tot,tree[*N];
long long a[N],b[N];
long long suma[N],sumb[N],c[*N];
struct node{
int ha,hb,id;
}s[N],d[N];
void add(int x,int k){
for(;x<=tot;x+=(x&-x))tree[x]=min(tree[x],k);
}
void clear(int x){
for(;x<=tot;x+=(x&-x))tree[x]=inf;
}
int ask(int x){
int num=inf;
for(;x;x-=(x&-x))num=min(tree[x],num);
return num;
}
void work(int l,int r){
if(l==r){
return;
}
int mid=(l+r)/;
work(l,mid),work(mid+,r);
int ll=l,rr=mid+,p=l;
while(ll<=mid&&rr<=r){
if(s[ll].ha<=s[rr].ha){
add(s[ll].hb,s[ll].id);
d[p++]=s[ll++];
}
else{
int x=ask(s[rr].hb);
if(x!=inf)ans=max(ans,s[rr].id-x);
d[p++]=s[rr++];
}
}
while(rr<=r){
int x=ask(s[rr].hb);
if(x!=inf)ans=max(ans,s[rr].id-x);
d[p++]=s[rr++];
}
for(int i=l;i<=ll;i++){
clear(s[i].hb);
}
while(ll<=mid)d[p++]=s[ll++];
for(int i=l;i<=r;i++)s[i]=d[i];
}
int main(){
// freopen("sequence.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=;i<=n;i++){
scanf("%lld",&b[i]);
}
for(int i=;i<=n;i++){
if(i)suma[i]=suma[i-]+a[i];
if(i)sumb[i]=sumb[i-]+b[i];
c[++tot]=suma[i],c[++tot]=sumb[i];
}
sort(c+,c+tot+);
tot=unique(c+,c+tot+)-c-;
for(int i=;i<=tot;i++)tree[i]=inf;
for(int i=;i<=n;i++){
s[i].ha=lower_bound(c+,c+tot+,suma[i])-c;
s[i].hb=lower_bound(c+,c+tot+,sumb[i])-c;
s[i].id=i;
}
work(,n);
printf("%d\n",ans);
return ;
}

一开始没有处理0的位置,出题人慷慨地送了我90pts

T2:

区间DP+四边形不等式优化

DP合并方式是枚举决策点,左右可以看作独立的树,然后再整体加一层的贡献

发现决策点单调,于是f[i][j]只从p[i][j-1]->p[i+1][j]枚举决策点。p为决策点数组。

跳过四边形不等式证明:如果觉得决策点单调就把决策点矩阵打印出来,发现行列上均单调,则有可能可以四边形不等式优化。

O(n2

#include<iostream>
#include<cstdio>
using namespace std;
const long long inf=1e18;
int n,a[],p[][];
long long f[][],sum[];
int main()
{
// freopen("tree.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
f[i][j]=inf;
}
}
for(int i=;i<=n;i++)f[i][i]=a[i],p[i][i]=i;
for(int i=;i<=n;i++){
for(int j=;j+i-<=n;j++){
for(int k=p[j][j+i-];k<=p[j+][j+i-];k++){
if(f[j][k-]+f[k+][j+i-]+sum[j+i-]-sum[j-]<f[j][j+i-]){
f[j][j+i-]=f[j][k-]+f[k+][j+i-]+sum[j+i-]-sum[j-];
p[j][j+i-]=k;
}
}
}
}
printf("%lld\n",f[][n]);
return ;
}

T3:

设从k点开始转移,以1的最终值为答案。

列出转移方程:f[i]=∑f[j]/x+1,x为i的出度。移项,列出高斯消元数组。

对于一个点,当它作为k时,它的f值为0。又发现对于不同的k,每次其它点的消元式子并不会发生变化。

线段树分治,每次存下当前的数组,只消元一半,然后递归进下一层。当处理到只有一个点的区间时,这个点的答案即为消元数组中1号点对应的答案。

一开始避免了消元时的选行,以及消元的时候出现0似乎没有什么影响:

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=;
int n,m;
int ver[],Next[],head[],tot,chu[];
long long val[][],ans[],d[][][];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
long long ks(long long x,int k){
long long num=;
while(k){
if(k&)num=num*x%mod;
x=x*x%mod;
k>>=;
}
return num;
}
void make(int l,int r){
// int pos;
for(int i=l;i<=r;i++){
// pos=i;
// for(int j=i;j<=n;j++){
// if(val[j][i]>val[pos][i])pos=j;
// }
// for(int j=1;j<=n+1;j++){
// swap(val[i][j],val[pos][j]);
// }
int tmp=val[i][i];
if(!tmp)continue;
long long inv=ks(tmp,mod-);
for(int j=;j<=n+;j++){
val[i][j]=val[i][j]*inv%mod;
}
for(int j=;j<=n;j++){
if(j!=i){
int s=val[j][i];
for(int k=;k<=n+;k++){
val[j][k]=(val[j][k]-s*val[i][k]%mod+mod)%mod;
}
}
}
}
}
void work(int l,int r,int dep){
if(l==r){
ans[l]=val[][n+];
return;
}
// long long d[310][310];
for(int i=;i<=n;i++){
for(int j=;j<=n+;j++){
d[dep][i][j]=val[i][j];
}
}
int mid=(l+r)/;
make(l,mid);
work(mid+,r,dep+);
for(int i=;i<=n;i++){
for(int j=;j<=n+;j++){
val[i][j]=d[dep][i][j];
}
}
make(mid+,r);
work(l,mid,dep+);
}
int main()
{
// freopen("walk.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
chu[x]++;
}
for(int i=;i<=n;i++){
val[i][i]=-chu[i];
// long long inv=ks(chu[i],mod-2);
for(int j=head[i];j;j=Next[j]){
int y=ver[j];
val[i][y]++;
}
val[i][n+]=-chu[i];
}
work(,n,);
for(int i=;i<=n;i++){
printf("%lld\n",ans[i]);
}
return ;
}

这样选行会错的原因是,对于一个k来说,整个消元过程中它是不能被选择到的。在它作为k的意义下,它的数组其实相当于不存在。

及时跳出选行即可:

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=;
int n,m;
int ver[],Next[],head[],tot,chu[];
long long val[][],ans[],d[][][];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
long long ks(long long x,int k){
long long num=;
while(k){
if(k&)num=num*x%mod;
x=x*x%mod;
k>>=;
}
return num;
}
void make(int l,int r){
int pos;
for(int i=l;i<=r;i++){
pos=i;
for(int j=i;j<=n;j++){
if(val[j][i]){pos=j;break;}
}
for(int j=;j<=n+;j++){
swap(val[i][j],val[pos][j]);
}
for(int j=;j<=n+;j++)val[i][j]=(val[i][j]+mod)%mod;
int tmp=val[i][i];
if(!tmp)continue;
long long inv=ks(tmp,mod-);
for(int j=;j<=n+;j++){
val[i][j]=val[i][j]*inv%mod;
}
for(int j=;j<=n;j++){
if(j!=i){
int s=val[j][i];
for(int k=;k<=n+;k++){
val[j][k]=(val[j][k]-s*val[i][k]%mod+mod)%mod;
}
}
}
}
}
void work(int l,int r,int dep){
if(l==r){
ans[l]=val[][n+];
return;
}
// long long d[310][310];
for(int i=;i<=n;i++){
for(int j=;j<=n+;j++){
d[dep][i][j]=val[i][j];
}
}
int mid=(l+r)/;
make(l,mid);
work(mid+,r,dep+);
for(int i=;i<=n;i++){
for(int j=;j<=n+;j++){
val[i][j]=d[dep][i][j];
}
}
make(mid+,r);
work(l,mid,dep+);
}
int main()
{
// freopen("walk.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
chu[x]++;
}
for(int i=;i<=n;i++){
val[i][i]=-chu[i];
// long long inv=ks(chu[i],mod-2);
for(int j=head[i];j;j=Next[j]){
int y=ver[j];
val[i][y]++;
}
val[i][n+]=-chu[i];
}
work(,n,);
for(int i=;i<=n;i++){
printf("%lld\n",ans[i]);
}
return ;
}

↑上面的复杂度都是O(n3logn)每个点会被消log次,消一次是n2

//????????????????
//????????????
//exm??????
//??????????????? ?????????
#include<iostream>
#include<cstdio>
using namespace std;
const int mod=;
int n,m;
int ver[],Next[],head[],tot,chu[];
long long val[][],ans[],d[][][];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
long long ks(long long x,int k){
long long num=;
while(k){
if(k&)num=num*x%mod;
x=x*x%mod;
k>>=;
}
return num;
}
void make(int l,int r,int L,int R){
for(int i=l;i<=r;i++){
// for(int j=1;j<=n+1;j++)val[i][j]=(val[i][j]+mod)%mod;
int tmp=val[i][i];
if(!tmp)continue;
long long inv=ks(tmp,mod-);
for(int j=L;j<=R;j++){
val[i][j]=val[i][j]*inv%mod;
}
val[i][n+]=val[i][n+]*inv%mod;
for(int j=;j<=n;j++){
if(j!=i){
int s=val[j][i];
if(!s)continue;
for(int k=L;k<=R;k++){
val[j][k]=(val[j][k]-s*val[i][k]%mod+mod)%mod;
}
val[j][n+]=(val[j][n+]-s*val[i][n+]%mod+mod)%mod;
}
}
}
}
void work(int l,int r,int dep){
if(l==r){
ans[l]=val[][n+];
return;
}
// long long d[310][310];
for(int i=;i<=n;i++){
for(int j=l;j<=r;j++){
d[dep][i][j]=val[i][j];
}
d[dep][i][n+]=val[i][n+];
}
int mid=(l+r)/;
make(l,mid,l,r);
work(mid+,r,dep+);
for(int i=;i<=n;i++){
for(int j=l;j<=r;j++){
val[i][j]=d[dep][i][j];
}
val[i][n+]=d[dep][i][n+];
}
make(mid+,r,l,r);
work(l,mid,dep+);
for(int i=;i<=n;i++){
for(int j=l;j<=r;j++){
val[i][j]=d[dep][i][j];
}
val[i][n+]=d[dep][i][n+];
}
}
int main()
{
// freopen("walk.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
chu[x]++;
}
for(int i=;i<=n;i++){
val[i][i]=-chu[i];
// long long inv=ks(chu[i],mod-2);
for(int j=head[i];j;j=Next[j]){
int y=ver[j];
val[i][y]++;
}
val[i][n+]=-chu[i];
}
work(,n,);
for(int i=;i<=n;i++){
printf("%lld\n",ans[i]);
}
return ;
}

抄思路&&%%%巨神

↑这个是O(n3

为什么????陷入迷惑

2019.10.29 csp-s模拟测试93 反思总结的更多相关文章

  1. 2019.10.29 CSP%您赛第四场t2

    我太菜了我竟然不会分层图最短路 ____________________________________________________________________________________ ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  6. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  7. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  8. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  9. 2019.10.29 csp-s模拟测试92 反思总结

    今天快乐的墨雨笙因为什么而几乎爆零了呢? 顾此失彼+不会对拍+无脑的复杂度 今天高兴的墨雨笙又因为什么调了一个下午呢? 不明题意+不想范围+板子低级错误 R.I.P. T1: //唉 //害怕TLE, ...

随机推荐

  1. HTTP协议响应篇

    http响应的基本介绍 一个HTTP响应代表服务器向客户端回送的数据, 由三个部分构成 状态行[200 , 302 304, 403, 404, 500] 响应消息头 返回的实体内容 http响应状态 ...

  2. spring boot过滤器FilterRegistrationBean

    有2种方式可以实现过滤器 1:通过FilterRegistrationBean实例注册 2:通过@WebFilter注解生效 这里选择第一种,因为第二种不能设置过滤器之间的优先级 为了演示优先级,这里 ...

  3. 炮兵阵地 /// 状压DP oj26314

    题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...

  4. VMware Workstation 10 简体中文安装教程

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 分享到 一键分享 QQ ...

  5. vue表格之:summary-method="getSummaries"与show-summary(列求和)

    //表格列求和 <el-table :summary-method="getSummaries" show-summary></el-table> getS ...

  6. 模拟实现call、apply

    1. 知识点补充: 首先在模拟实现前,先Mark一些我之前不知道的知识: a. eval(string)函数:可计算某个字符串,并执行其中的JavaScript代码 其中,string是必需传入的待计 ...

  7. LoadRunner脚本编写(5)-- 检查点,关联等函数

    LoadRunner脚本编写(5)-- 检查点,关联等函数 http://www.51testing.com/?34866/action_viewspace_itemid_70224.html来继续翻 ...

  8. leetcode 131 Palindrome Pairs

    lc131 Palindrome Pairs 解法1: 递归 观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome 那么挑选cut的位置就很有意思,后一次cut可以建立在前一 ...

  9. ng-zorro-mobile中遇到的问题

    一.Modal(弹出框)使用上的问题 在官方文档中,Modal是这样使用的: 这里需要注意的一点就是,看到上方代码中只用了Modal的全局方式,所以个人认为下面这段注入初始化的东西是没有用的便去掉: ...

  10. 牛人blog 头脑风暴 (持续添加与更新)

    Http协议详解 http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html android 实现分享功能两种方法 http://w ...