[TD Cup 2014] TDL的YC牌 & TDL的幼儿园

TDL的YC牌

传说中的置换群?反正不懂。我的思路竟然是对的,可是为何只有20分?

(1)尼玛每行数据输出后回车不打!

(2)写gcd函数脑残把a mod b写成a-b,大大减慢速度…

(3)看标程才想到用快速幂,第一次知道置换也可以快速幂。

(4)大小姐啊麻烦你下次看数据范围别把0的个数给数错的……

果然什么题都要见识一下。跑数据的时候速度仍然堪忧(最后三个点),可能是电脑问题,也可能还能优化?

program yc;
const maxn=100000+10;
      q=1e-6;
var t1,t2,t3,jn,p:int64;
    tt3:real;
    a,b,c,d,base,baset,ans,anst:array[1..maxn] of longint;
    i,t,n,jt,x,k,j:longint;
function gcd(a,b:int64):integer;
var t:int64;
begin
  if b>a then
    begin
      t:=a;a:=b;b:=t;
    end;
  if (a=0) or (b=0) then exit(1);
  if a mod b=0 then gcd:=b else gcd:=gcd(b,a mod b);
end;

function eq(a:real;b:int64):boolean;
begin
  if abs(a-b)<=q then exit(true) else exit(false);
end;

begin
  assign(input,‘yc10.in‘);reset(input);
  assign(output,‘yc10.out‘);rewrite(output);
  readln(t);
  for i:=1 to t do
    begin
      readln(n,t1,t2);
      jn:=1;
      for j:=1 to n do
        read(b[j]);
      for j:=1 to n do
        begin
          jt:=1;x:=b[j];
          while x<>j do
            begin
              x:=b[x];
              inc(jt);
            end;
          jn:=jn div gcd(jn,jt) * jt;
        end;
      {for j:=1 to n do a[j]:=j;
      fillchar(jp,sizeof(jp),$7f);
      c:=a;
      for j:=1 to 30 do
        begin
          for k:=1 to n do
            d[k]:=c[b[k]];
          c:=d;
          for k:=1 to n do
            if (a[k]=d[k]) and (k<jp[k]) then jp[k]:=j;
        end;}
      {for j:=1 to n do
        jn:=jn*jt div gcd(jn,jt); }
      for k:=-t2 to t2 do
        begin
          tt3:=(t1+k*jn)/t2;
          if (eq(tt3,round(tt3))) and (tt3>0) then break;
        end;
      t3:=round(tt3);
      for j:=1 to n do
        a[j]:=j;
      for j:=1 to n do ans[j]:=j;
      for j:=1 to n do anst[j]:=j;
      for j:=1 to n do base[j]:=b[j];
      p:=t3;
      while p>0 do
      //for p:=1 to t3 do
        begin
          {for k:=1 to n do
            begin
              //c[k]:=b[a[k]];
              c[b[k]]:=a[k];
            end;
          a:=c;
          inc(p);}
          if p mod 2=1 then
            for j:=1 to n do anst[j]:=ans[base[j]];
          ans:=anst;
          for j:=1 to n do baset[j]:=base[base[j]];
          base:=baset;
          p:=p div 2;
        end;
      {for j:=1 to n do
        c[a[j]]:=j;}
      for j:=1 to n do
        write(ans[j],‘ ‘);
      writeln;
    end;
  close(input);close(output);
end.

yc

TDL的幼儿园

昨天又4个人AC,果然我是弱渣,根本看不出这是网络流模型- -!今天学习了Dinic算法,为何感觉比之前写的更简短且容易理解?(咳咳之前那次写的手工栈)

对题目进行网络流建模,源点(编号0)向每个小朋友连一条边,容量为Ci,所有糖向汇点(编号m+n+1)连一条边,容量为Vi,小朋友和它想要的糖之间连一条容量为inf的边。(要注意inf最好不要设置成maxlongint,否则万一它的flow为负,两者一加就超过范围了,结果坑爹的Lazarus还不报错,传进去一个接近-maxlongint的值,当然这有可能是初始化一开始出错造成的。最后我inf设置成了maxlongint div 2)

P.S. 题解要不要写的那么暴力啊,一会儿割小朋友,一会儿把它的所有的糖给割掉…

跟踪了一些变量来搞懂,没有时间把它搞精通了,所以默默地背代码去了。

话说,我100年没有写链表了!…貌似,这次写的还比较顺…

程序很大程度参考了http://www.cnblogs.com/htfy/archive/2012/02/15/2353147.html,我没有用静态链表,所以没写xor 1这种办法,用了dec_flow这样一个查找+修改flow的过程。

一开始跑数据死循环啊!尼玛建边的时候下次注意一点,这次建双向边但是回边的flow是0,不能和去边一样啊 =v=

program kd2;
type ptype=^node;
     node=record
             w,v,flow:longint;
             next:ptype;
           end;
const inf=maxlongint div 2;
      maxn=1000;
var n,m,tar,sta,v,c,x,cn,i,j:longint;
    head:array[0..2*maxn+10] of ptype;
    visit:array[0..2*maxn+10] of boolean;
    d,q:array[0..2*maxn+10] of longint;// distance to st;

function min(a,b:longint):longint;
begin
  if a<b then exit(a) else exit(b);
end;

procedure add_edge(st,ed,w:longint);
var p,q,pre:ptype;
begin
  new(q);
  q:=head[st];
  new(p);
  p^.w:=w;p^.v:=ed;p^.flow:=0;p^.next:=nil;
  if q=nil then
    begin
      new(head[st]);
      head[st]^:=p^;
    end
  else
    begin
      while q<>nil do
        begin
          pre:=q;
          q:=q^.next;
        end;
      new(q);
      q^:=p^;
      pre^.next:=q;
    end;
end;

function bfs:boolean;
var star,rear,x,u:longint;
    y:ptype;
begin
  fillchar(visit,sizeof(visit),false);
  fillchar(q,sizeof(q),0);
  star:=1;rear:=1;d[sta]:=1;visit[sta]:=true;q[star]:=sta;
  while star<=rear do
    begin
      x:=q[star];
      y:=head[x];
      while y<>nil do
        begin
          if (not visit[y^.v]) and (y^.flow<y^.w) then
            begin
              visit[y^.v]:=true;
              d[y^.v]:=d[x]+1;
              inc(rear);
              q[rear]:=y^.v;
            end;
          y:=y^.next;
        end;
      inc(star);
    end;
  exit(visit[tar]);
end;

procedure dec_flow(st,ed,delta:longint);
var x:ptype;
begin
  x:=head[st];
  while x^.v<>ed do x:=x^.next;
  x^.flow:=x^.flow-delta;
end;

function add_flow(p,maxflow:longint):longint;
var u,o:longint;
    y:ptype;
begin
  if (p=tar) or (maxflow=0) then exit(maxflow);
  add_flow:=0;
  y:=head[p];
  while y<>nil do
    begin
      if (d[y^.v]=d[p]+1) and (y^.flow<y^.w) then
        begin
          o:=add_flow(y^.v,min(maxflow,y^.w-y^.flow));
          if o>0 then
            begin
              inc(y^.flow,o);
              //dec(op_y.flow,o);
              dec_flow(y^.v,p,o);
              dec(maxflow,o);inc(add_flow,o);
              if maxflow=0 then break;
            end;
        end;
      y:=y^.next;
    end;
end;

function network:longint;
begin
  network:=0;
  while bfs do
    begin
      inc(network,add_flow(sta,inf));
    end;
end;

begin
  assign(input,‘kd.in‘);reset(input);
  assign(output,‘kd.out‘);rewrite(output);
  readln(n,m);sta:=0;tar:=m+n+1;
  for i:=1 to m do
    begin
      read(v);
      add_edge(n+i,tar,v);
      add_edge(tar,n+i,0);
    end;
  for i:=1 to n do
    begin
      read(c);
      cn:=cn+c;
      add_edge(sta,i,c);
      add_edge(i,sta,0);
      read(x);
      for j:=1 to x do
        begin
          read(c);
          add_edge(i,n+c,inf);
          add_edge(n+c,i,0);
        end;
      readln;
    end;
  writeln(cn-network);
end.

kd

[TD Cup 2014] TDL的YC牌 & TDL的幼儿园

时间: 2024-10-16 22:58:12

[TD Cup 2014] TDL的YC牌 & TDL的幼儿园的相关文章

2014巴西世界杯足球赛病毒抢先开踢

网络犯罪份子擅长利用可以引起人们好奇心的世界性事件.如即将到来的2014年巴西世界杯足球赛,在全世界还都在等待它的到来时,网络犯罪分子已经推出了在世界各地寻找受害者的新威胁. 搜寻结果导致恶意软件和广告软件 趋势科技最近看到一个名为Jsc Sport Live + Brazil World Cup 2014 HD.rar的文件,里面包含了文件Brazil World Cup Streaming 2014.exe.这是一个被侦测为BKDR_BLADABIN.AB的后门程序.这支后门程序是BLADA

从微软小冰看微软运营手段的转型

6.1微软小冰被封杀后,果然应了之前网友们那句话"MS这下跟TX结仇没准就投奔TX的对手了"--最近又传出要与米聊和易信合作!想想当初微信.易信.来往掐的多火热...... 不知各位都"调戏"过小冰没,这里用"调戏"一词可能有人会觉着不妥,但个人认为无论是从小冰的发布会还是到小冰账号头像再到使用体验,都给人一种,娱乐.放松.年轻甚至有点非主流的感觉.想想前阵子爆完奶茶和Mr刘的绯闻后,MS不久便把奶茶收了,从那以后MS便走上了"本土化推

表格布局----基于bootstrap样式 布局

在实际开发中,我们通过菜鸟教程复制的表格往往不能满足我们的开发需求,样式很难看,而且不能自适应,尤其是需要到处Excel的样式,感觉非常糟糕,这次我就写了一个表单,不足之处,希望大神们多多指教: 代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>查询详情</title> 5 <meta name="keywords" content=""/>

动态图片轮播

背景:    不同的活动需要对不同的图片进行轮播.所以要求按活动,先选择图片,然后把对这些图片进行轮播. 失败的尝试: html+jquery+ajax+bootstap +dot.js 操作步骤: 1 html onload时使用ajax 取得,活动涉及的所有图片. 2 使用 dot.js 进行html的拼接. 问题: 如果不使用dot拼接,直接把<img src="/xxx.jpg"/> 图片列出来一切正常, 但是一旦使用dot之后,就出问题了,图片显示出来的,但是不能

ToDoList

// ToDoListWnd.cpp : implementation file // #include "stdafx.h" #include "ToDoList.h" #include "ToDoListWnd.h" #include "ToolsCmdlineParser.h" #include "ToolsUserInputDlg.h" #include "Toolshelper.h&qu

JS获取客户端计算机硬件信息与系统信息大全

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script> var info = allinfo(); document.write(info); var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 

.Net学习笔记----2015-07-15(HTML+CSS练习)

实现如下效果 下面是代码:其实全是体力活啊 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <!--<lin

HTML——传统布局的使用

传统布局:使用table来做整体页面的布局 总结:这种方式来制作页面现在也不是很多了,感觉并不是很高效. 需要先用photoshop量出页面布局具体的尺寸位置,再将其划分为表格,对每个格子进行编辑. 每个格子可以嵌套表格,这样有时候写着写着还有点迷糊,要重新找到编辑位置属于哪一个表格的哪个位置,通常会将表格的border设置为1,方便检查 <!DOCTYPE html> <html lang="en"> <head> <meta charset

js获取浏览器信息及版本(兼容IE)

获取浏览器信息方法有很多种,但是要是兼容ie旧版本就有点麻烦了,因为很多方法在旧版本ie是不支持的,所以ie我做了单独处理,但是目前还有小问题,就是想显示QQ浏览器,搜狗浏览器..这样的,这样还实现不了,因为他们用的别人的浏览器内核,没办法 代码: <template> <section class="p-10"> <h1> {{ browse }} </h1> </section> </template> <