比赛时间:2018.10.15 选手:lrllrl 用时:2h 得分:100+10+90=200




最初想法是一个背包问题。首先背包问题的模型肯定是不行的,但是我们可以列出状态转移方程后发现,每个状态决策会对它之后的决策产生后效性。所以我们就倒着来考虑。考虑最终的结果会是怎么求出来的(假设只有 a a a, b b b 同理):
a n s = ( w × a i 1 + w × Δ k × a i 2 + ⋯ + w × Δ k m − 1 × a i m ) ans=(w\times a_{i_1}+w\times\Delta k\times a_{i_2}+\cdots+w\times\Delta k^{m-1}\times a_{i_m}) ans=(w×ai1​​+w×Δk×ai2​​+⋯+w×Δkm−1×aim​​)
变形为我们倒序的情况:
a n s = w × ( Δ k m − 1 × a i m + ⋯ + Δ k × a i 2 + a i 1 ) ans=w\times(\Delta k^{m-1}\times a_{i_m}+\cdots+\Delta k\times a_{i_2}+a_{i_1}) ans=w×(Δkm−1×aim​​+⋯+Δk×ai2​​+ai1​​)
我们发现这样没走一步对后面没有影响,所以尽量让当前最大就行了。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,k,c,w,x[N],type[N];
double deltak,deltac,ans=0;
int main()
{//freopen("explo.in","r",stdin);//freopen("explo.out","w",stdout);scanf("%d%d%d%d",&n,&k,&c,&w);deltak=1.0-0.01*k;deltac=1.0+0.01*c;for(int i=1;i<=n;i++)scanf("%d%d",&type[i],&x[i]);for(int i=n;i;i--)if(type[i]==1)ans=max(ans,ans*deltak+x[i]);else ans=max(ans,ans*deltac-x[i]);printf("%.2f\n",ans*w);return 0;
}



根据抽屉原理,当询问区间长度大于 p p p 的时候一定存在一段子区间的和能被 p p p 整除的情况。
考虑小于 p p p 的长度,我们记录前缀和,O(n)扫描前缀和的同时查找曾经出现过的与其最相近的前缀和。作差取最小值。
正解是写treap或splay或替罪羊树啥的,我这里set居然过了也是神奇。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int N=5e5+10;
typedef long long ll;
const ll INF=0x7fffffff;
template<class T>inline void read(T&x)
{x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();if(f)x=-x;
}
int n,m,l,r,p,a[N];
ll sum[N];
int main()
{//freopen("in.txt","r",stdin);read(n);read(m);for(int i=1;i<=n;i++)read(a[i]),sum[i]=sum[i-1]+a[i];while(m--){read(l);read(r);read(p);int ans=p;if(r-l+1>=p){puts("0");continue;}set<int>s;s.clear();s.insert(0);for(int i=l;i<=r;i++){int tmp=(sum[i]-sum[l-1])%p;set<int>::iterator it=s.upper_bound(tmp);if(it!=s.begin())it--;ans=min(ans,tmp-*it);s.insert(tmp);}printf("%d\n",ans);}return 0;
}




这题居然是T3,让人感到惊奇,一看就是个二分+spfa。准备就这么过掉时突然想到一种情况,如果一个负环与 n n n 点不连通,可能会花费许多无用的值去使它变成非负环。于是先建反图深搜一遍打个标记再建图二分跑spfa。(于是我判断1号点是否连通写错了,90分qwq)

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=110,M=1e5+10;
int n,m,hd[N],vis[N],tot,t,cnt[N],avl[N];
ll dis[N],ans;
struct Edge{int v,w,nx;
}e[M];
struct edge{int u,v,w;
}tmp[M];
void add(int u,int v,int w)
{e[++tot].v=v;e[tot].w=w;e[tot].nx=hd[u];hd[u]=tot;
}
ll spfa(int mid)
{memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));memset(cnt,0,sizeof(cnt));queue<ll>q;while(q.size())q.pop();q.push(1);vis[1]=1;dis[1]=0;while(q.size()){int u=q.front();q.pop();vis[u]=0;for(int i=hd[u];i;i=e[i].nx){int v=e[i].v;if(!avl[v])continue;if(dis[v]>dis[u]+e[i].w+mid){dis[v]=dis[u]+e[i].w+mid;if(!vis[v]){q.push(v);if(++cnt[v]>=n)return -0x3f3f3f3f;}}}}return dis[n];
}
void dfs(int u){avl[u]=1;for(int i=hd[u];i;i=e[i].nx)if(!avl[e[i].v])dfs(e[i].v);}
int main()
{//freopen("earth.in","r",stdin);//freopen("earth.out","w",stdout);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(hd,0,sizeof(hd));tot=0;memset(avl,0,sizeof(avl));for(int i=1;i<=m;i++)scanf("%d%d%d",&tmp[i].u,&tmp[i].v,&tmp[i].w);for(int i=1;i<=m;i++)add(tmp[i].v,tmp[i].u,tmp[i].w);dfs(n);memset(hd,0,sizeof(hd));tot=0;for(int i=1;i<=m;i++)add(tmp[i].u,tmp[i].v,tmp[i].w);int l=-100000,r=100000,mid;if(!avl[1]){printf("-1\n");continue;}while(l<=r){int mid=(l+r)/2;ll dist=spfa(mid);if(dist>=0)ans=dist,r=mid-1;else l=mid+1;}printf("%lld\n",ans);}return 0;
}

赛后总结

问题有很多:
1.T1没有很快的反应过来倒序消除后效性再贪心的每步去最大值,足足浪费50分钟。
2.T2的暴力居然只打了十分。而且没有想到可以固定左端点二分右端点,思路没有打开,没想清楚根据前缀和作差可以考虑到任何一个子区间。只要想到这点,即便甩个set上去也能AC
3.T3的判断连通瞎姬霸写,又丢掉10分。
分就是这样一点一点扣下去的,扣着扣着就是1=—>2=。吸取教训。

【比赛报告】2018.10.15校赛[2015-9-13 NOIP模拟赛 by hzwer] NOIP练习赛卷十四相关推荐

  1. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  2. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  3. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  4. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

  5. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  6. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  7. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  8. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  9. 【比赛报告】2018.10.11校赛[8-2情人节欢乐赛] NOIP练习赛卷十二

    比赛时间:2018.10.10 选手:lrllrl 成绩 100+100+100=300 用时:约1h T1 果实计数 显然易得,答案为 b n m o d    k b^n\mod k bnmodk ...

最新文章

  1. PCL中outofcore模块---基于核外八叉树的大规模点云的显示
  2. 红帽7 -本地yum配置
  3. 5.5.2 最小的N个和
  4. 从零开始使用Skywalking分布式链路追踪系统
  5. aws cli_学习AWS CLI:AWS CLI概述(AWS命令行界面)
  6. 作为一个非天才型选手,普通程序员如何升级打怪?
  7. dolphin.php 视频,DolphinPHP V1.0.4发布
  8. QT学习资料博客:《Qt 实战一二三》和《Qt 学习之路 2》等
  9. 计算机cpu近几年价格,2014年6月15日电脑CPU最新报价(表格)
  10. 计算机房精密空调术语,机房空调常用单位及计算公式
  11. linux添加菜单栏,Gnome desktop主菜单中添加自己的菜单栏
  12. 郁亮的“权力游戏”,万科的“内外战争”
  13. 扒皮下音悦台的“返回顶部”图标效果
  14. numpy 处理txt的简单样例
  15. 视频分析代码douyin
  16. 微服务09——中间件
  17. 如何制作点餐小程序?
  18. Spring Cloud Gateway 集成Sa-Token
  19. TCP拥塞控制算法纵横谈-Illinois和YeAH
  20. 美团招博士后啦!深度学习、强化学习、计算机视觉与NLP、法学方向

热门文章

  1. 浙江省谷歌地球高程DEM等高线下载
  2. tkinter动态表格 - 实时更新数据(TkinterTable)
  3. 只有安卓系统的浏览器提示证书不受信任的问题 ----- 证书链不完整的解决办法
  4. 关于U盘中病毒将文件改为系统文件属性并隐藏文件夹的解决方法
  5. 九章算法面试题87 最小子数组
  6. 关于pppd移植和3g功能
  7. java treeview控件_【TreeView下载】TreeView控件 v1.1.6 官方版-开心电玩
  8. Xenu-web开发死链接检測工具应用
  9. 从零开始编译OpenWrt固件
  10. 青蛙过河游戏c语言,C语言动态规划(7)___过河(Vijos P1002)