WC2011 XOR

题目链接

题意简述

求一条\(1\sim n\)的路径,使路径上的边权异或和最大.

解析

一条路径可以视为\(1\sim n\)的简单路径加上某些环.
可能我们一开始选的链不够优秀,但是我们能加上某些环来优化答案.
如果有一个很远的环,我们可以从链上走过去,遍历整个环,然后再走回来.
走过去走回来的这一段的\(xor\)值显然抵消了,于是只剩下了一个环.

如果有另一条链,假设比现在的链更优.
那么这一条链显然与现在的链形成了某些环.
那么还是相当于现在的链异或上某些环的权值,然后找到最大值.

因此我们将所有的环搞出来,然后扔进线性基中,然后随便取一条\(1\sim n\)的路径作为初始答案,在线性基中查询即可.

代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define N (100010)
#define M (200010) 
#define inf (0x7f7f7f7f)
#define rg register int
#define Label puts("NAIVE")
#define spa print(' ')
#define ent print('\n')
#define rand() (((rand())<<(15))^(rand()))
typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
using namespace std;
inline char read(){
    static const int IN_LEN=1000000;
    static char buf[IN_LEN],*s,*t;
    return (s==t?t=(s=buf)+fread(buf,1,IN_LEN,stdin),(s==t?-1:*s++):*s++);
}
template<class T>
inline void read(T &x){
    static bool iosig;
    static char c;
    for(iosig=false,c=read();!isdigit(c);c=read()){
        if(c=='-')iosig=true;
        if(c==-1)return;
    }
    for(x=0;isdigit(c);c=read())x=((x+(x<<2))<<1)+(c^'0');
    if(iosig)x=-x;
}
inline char readchar(){
    static char c;
    for(c=read();!isalpha(c);c=read())
    if(c==-1)return 0;
    return c;
}
const int OUT_LEN = 10000000;
char obuf[OUT_LEN],*ooh=obuf;
inline void print(char c) {
    if(ooh==obuf+OUT_LEN)fwrite(obuf,1,OUT_LEN,stdout),ooh=obuf;
    *ooh++=c;
}
template<class T>
inline void print(T x){
    static int buf[30],cnt;
    if(x==0)print('0');
    else{
        if(x<0)print('-'),x=-x;
        for(cnt=0;x;x/=10)buf[++cnt]=x%10+48;
        while(cnt)print((char)buf[cnt--]);
    }
}
inline void flush(){fwrite(obuf,1,ooh-obuf,stdout);}
int n,m,ne[M],fi[N],b[M],E;
LL dis[N],c[M]; bool vis[N];
struct LB{
    LL a[101];
    void insert(LL x){
        for(int i=62;i>=0;i--){
            if(!((x>>(LL)i)&1ll))continue;
            if(!a[i]){a[i]=x;break;}
            x^=a[i];
        }
    }
    LL getmax(LL x){
        LL ans=x;
        for(int i=62;i>=0;i--)
        if(ans<(ans^a[i]))ans^=a[i];
        return ans;
    }
}S;
void add(int x,int y,int z){
    ne[++E]=fi[x],fi[x]=E,b[E]=y,c[E]=z;
}
void dfs(int u,LL res){
    dis[u]=res,vis[u]=1;
    for(int i=fi[u];i;i=ne[i]){
        int v=b[i];
        if(vis[v])S.insert(res^c[i]^dis[v]);
        else dfs(v,res^c[i]);
    }
}
int main(){
    read(n),read(m);
    for(int i=1;i<=m;i++){
        int x,y; LL z;
        read(x),read(y),read(z);
        add(x,y,z),add(y,x,z);
    }
    dfs(1,0);
    printf("%lld\n",S.getmax(dis[n]));
}

转载于:https://www.cnblogs.com/Romeolong/p/10062880.html

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
以下代码在radasm编译后打开.exe无法生成窗口_ProcWinMain proc uses ebx esi edi hWnd,wMsg,wParam,lParam LOCAL @stPs:PAINTSTRUCT LOCAL @hDc mov eax,wMsg .if eax==WM_CREATE mov Score,0 mov PlayFlag,1 mov Velocity,400 invoke LoadIcon,hInstance,ID_ICO invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax .elseif .else invoke DefWindowProc,hWnd,wMsg,wParam,lParam ret .endif xor eax,eax ret _ProcWinMain endp ;******************************************************************** ;创建窗口 ;******************************************************************** WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL @wc:WNDCLASSEX LOCAL @msg:MSG LOCAL @hwnd:HWND mov @wc.cbSize,sizeof WNDCLASSEX mov @wc.style,CS_HREDRAW or CS_VREDRAW mov @wc.lpfnWndProc,offset _ProcWinMain mov @wc.cbClsExtra,NULL mov @wc.cbWndExtra,NULL push hInstance pop @wc.hInstance invoke LoadMenu,hInstance,IDR_MENU mov hMenu,eax mov @wc.hbrBackground,COLOR_BTNFACE+1 mov @wc.lpszMenuName,NULL mov @wc.lpszClassName,offset ClassName invoke LoadIcon,hInstance,ID_ICO mov @wc.hIcon,eax mov @wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov @wc.hCursor,eax invoke RegisterClassEx,addr @wc invoke CreateWindowEx,WS_EX_CLIENTEDGE or WS_EX_WINDOWEDGE,\ addr ClassName,addr AppName,\ WS_MINIMIZEBOX or WS_SYSMENU,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 132h,179h,NULL,hMenu,hInst,NULL mov @hwnd,eax invoke ShowWindow,@hwnd,CmdShow invoke UpdateWindow,@hwnd .while TRUE invoke GetMessage,addr @msg,NULL,0,0 .break .if(!eax) invoke TranslateMessage,addr @msg invoke DispatchMessage,addr @msg .endw mov eax,@msg.wParam ret WinMain endp start: invoke GetModuleHandle,NULL mov hInstance,eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax end start
03-27
<think>好的,我现在需要解决用户在RadAsm编译后生成的EXE文件无法生成窗口的问题,用户提到了“null”,可能和NULL指针有关。首先,我需要回忆一下关于NULL在编程中的相关知识,特别是C/C++中的NULL定义和使用情况。 根据用户提供的引用[1],NULL在C语言中被定义为指向内存地址0的指针,也就是((void *)0)。而C++中则定义为0或者nullptr。如果程序中错误地使用了NULL,可能会导致访问空指针,引发段错误或程序崩溃。用户提到的引用[2]中也提到了不同编译器下NULL的定义差异,以及在gcc下出现段错误的情况,这可能和NULL的错误使用有关。 接下来,用户的问题是关于RadAsm编译后的EXE无法生成窗口。可能的原因有几个方面:窗口创建过程中参数传递了错误的NULL值,比如窗口类注册失败、窗口过程函数指针为NULL,或者在创建窗口时父窗口句柄错误地设为NULL。此外,资源文件未正确链接也可能导致窗口无法显示,比如图标、菜单等资源引用错误,使用NULL可能导致资源加载失败。 需要进一步排查的步骤包括检查窗口注册是否正确,确保窗口类正确注册并且窗口过程函数有效;检查CreateWindowEx调用中的参数是否正确,特别是父窗口句柄、类名等;检查资源是否正确链接,比如是否在.rc文件中正确定义了资源,并且在代码中正确引用;最后,查看编译器的错误输出和调试信息,是否有关于空指针的警告或错误,或者使用调试器查看程序运行到哪一步时崩溃。 另外,用户可能在代码中误用了NULL,例如将本该是有效句柄的地方传递了NULL,或者在结构体中没有正确初始化成员为NULL。例如,在注册窗口类时,如果hbrBackground字段被错误地设为NULL,可能导致窗口绘制问题。或者,窗口过程函数WndProc的地址是否正确,没有被正确赋值导致为NULL,这样系统无法处理窗口消息,窗口无法创建。 还需要考虑RadAsm的编译设置是否正确,比如链接器是否包含必要的库文件,是否正确指定了入口点,或者是否存在项目配置错误导致资源未被正确编译进EXE文件中。有时候,资源脚本(.rc)中的错误,比如对话框模板中的控件引用错误,或者图标路径错误,也可能导致窗口创建失败。 总结来说,用户需要检查代码中所有使用NULL的地方,确保它们被正确使用,特别是在与窗口创建相关的API调用中。同时,检查资源文件和编译设置,确保没有因NULL或资源未正确链接导致的问题。通过逐步调试和查看编译日志,定位具体出错的位置。</think>在解决RadAsm编译后EXE文件无法生成窗口的问题时,需重点关注**NULL指针的使用场景**和**资源链接完整性**。以下是具体排查步骤: --- ### 一、NULL指针的典型错误场景 1. **窗口类注册失败** 注册窗口类时若`lpfnWndProc`(窗口过程函数指针)被错误赋值为NULL,系统将无法处理消息: ```c WNDCLASSEX wc = {0}; wc.lpfnWndProc = NULL; // 错误!必须指向有效的窗口过程函数 ``` 正确做法应指向自定义函数如`WndProc`[^1]。 2. **CreateWindowEx参数错误** 创建窗口时若`hMenu`或`hwndParent`误用NULL可能导致窗口层级混乱: ```c HWND hwnd = CreateWindowEx(0, "MyClass", "Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); // 两个NULL分别为hMenu和hInstance ``` 需确认`hMenu`是否需要关联菜单资源,而非直接置NULL。 --- ### 二、资源文件(.rc)与链接问题 1. **资源未正确链接** 若在.rc文件中定义了图标、菜单等资源但未正确引用,会导致窗口缺少关键属性: ```rc // MyResource.rc IDI_MAIN_ICON ICON "missing_icon.ico" // 路径错误时资源加载失败 ``` 编译时需确保资源文件路径正确,且编译器能正确生成.res文件并链接到EXE中。 2. **窗口样式依赖资源** 若窗口类指定了图标或菜单资源但未正确定义,窗口可能无法渲染: ```c wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON)); // 若IDI_MAIN_ICON未定义则返回NULL ``` --- ### 三、调试与验证方法 1. **检查注册窗口类的返回值** 使用`RegisterClassEx`后验证返回值: ```c if (!RegisterClassEx(&wc)) { MessageBox(NULL, "窗口类注册失败!", "错误", MB_ICONERROR); return 0; } ``` 2. **使用调试器定位NULL访问** 在RadAsm中启用调试器(如OllyDbg),观察程序是否在调用`CreateWindowEx`后因空指针访问触发异常。 3. **查看编译日志** 检查RadAsm的编译输出,确认.rc文件是否成功编译并链接,排除资源缺失导致的窗口初始化失败[^2]。 --- ### 四、代码修正示例 **错误代码片段**: ```c // 错误:窗口过程未定义,lpfnWndProc为NULL WNDCLASSEX wc = {0}; wc.lpfnWndProc = DefWindowProc; // 错误!应使用自定义处理函数 wc.hInstance = GetModuleHandle(NULL); ``` **修正后**: ```c // 正确定义窗口过程 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 注册窗口类 WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; // 指向有效函数 wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = "MyWindowClass"; RegisterClassEx(&wc); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值