BZOJ4636 蒟蒻的数列 链表

题目描述
DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知
道N次操作后数列中所有元素的和。他还要玩其他游戏,所以这个问题留给你解决。
INPUT:
第一行一个整数N,然后有N行,每行三个正整数a、b、k。
N<=40000 , a、b、k<=10^9
OUTPUT:
一个数,数列中所有元素的和
 
容易发现各操作之间无顺序性,因此将所有操作按k由大到小排序即可。
时间限制30秒,因此写个链表记录当前可用内存,每次在[a,b)中选择所有的可用内存覆盖并累加答案。
本来是按照彻底放弃时间效率的写法写的(一堆指针,各种判断),结果没想到就跑了240ms,BZOJ排第五。。。
数据太水,嗯。
 
自己的代码:
#include
#include
#define gm 40001
using namespace std;
int n;
typedef unsigned long long ull;
ull ans;
struct cmd
{
	int a,b,k;
	bool operator < (const cmd &y) const
	{return y.knext;
		stk[++top]=x;
		return;
	}
	x->last->next=x->next;
	x->next->last=x->last;
	stk[++top]=x;
}
inline void insert(heap *a,heap *b,heap *c)
{
	a->next=c;c->next=b;
	b->last=c;c->last=a;
}
#define min(a,b) (anext)
	{
		int &b=i->tou;
		int &e=i->wei;
		if(re) continue;
		ans+=(min(r,e)-max(f,b)+1llu)*v;
		if(f>b)
		{
			if(rtou=r+1;
				y->wei=e;
				insert(i,i->next,y);
			}
			e=f-1;
			continue;
		}
		if(rtou=0;beg->wei=1000000000;
	end=new heap;end->last=beg;
	beg->next=end;
	for(int i=0;i

你可能感兴趣的:(链表,BZOJ做题纪录)